要在 SQL 中计算累计总计,通常使用带有 SUM()
聚合和 OVER
子句的窗口函数。累计总计会基于指定的顺序(例如日期或 ID)逐行累加值。关键是定义一个窗口框架,该框架包括从数据集开始到当前行的所有行。例如,如果有一个包含 order_date
和 amount
列的 sales
表,则查询 SELECT order_date, amount, SUM(amount) OVER (ORDER BY order_date) AS running_total FROM sales;
计算随时间变化的累积销售额。OVER
子句中的 ORDER BY order_date
确保总和按顺序计算,将每一行的金额添加到之前的总额中。
对于不支持窗口函数(例如,较旧的 MySQL 版本)的数据库,另一种方法是使用自连接。此方法将表连接到自身,基于排序列将每一行与所有先前的行进行匹配。例如,使用相同的 sales
表,您可以编写:SELECT s1.order_date, SUM(s2.amount) FROM sales s1 JOIN sales s2 ON s1.order_date >= s2.order_date GROUP BY s1.order_date;
。在这里,每一行 s1
聚合了所有 s2
行,其中 s2.order_date
早于或等于 s1.order_date
。虽然这种方法有效,但它的效率低于窗口函数,尤其是对于大型数据集,因为它由于连接和分组而需要二次时间复杂度。
使用窗口函数时,请考虑性能和用例。添加 PARTITION BY
子句允许每组单独的累计总计(例如,SUM(amount) OVER (PARTITION BY region ORDER BY order_date)
)。确保索引排序列(例如,order_date
)以优化性能。窗口函数通常由于其可读性和效率而受到青睐,因为它们在单次传递中处理数据。自连接在有限的情况下可能仍然有用,但应避免用于大规模数据。始终验证 SQL 方言对窗口函数的支持,并使用您的数据集大小测试查询性能。