SQL 窗口函数与聚合函数:区别与联系
SQL 窗口函数与聚合函数:区别与联系
SQL 中的聚合函数和窗口函数都是用于对数据进行汇总和计算的强大工具,但它们在作用范围和结果呈现方式上存在显著差异。理解它们的区别和联系,能够帮助我们更好地利用 SQL 进行数据分析和报表生成。
一、 聚合函数:全局视角下的数据汇总
聚合函数,顾名思义,是对一组值进行聚合计算,返回单个值。常见的聚合函数包括:
COUNT()
:计算行数SUM()
:计算总和AVG()
:计算平均值MAX()
:查找最大值MIN()
:查找最小值MEDIAN()
:查找中位数
聚合函数通常与 GROUP BY
子句一起使用,将数据按照指定的列进行分组,然后对每个组应用聚合函数。如果没有 GROUP BY
子句,则聚合函数会将整个表视为一个组,返回单个聚合值。
示例:
假设有一张名为 sales
的表,包含以下数据:
Region | Product | Sales |
---|---|---|
East | A | 100 |
East | B | 200 |
West | A | 150 |
West | B | 250 |
North | A | 50 |
North | B | 100 |
使用聚合函数计算每个区域的总销售额:
sql
SELECT Region, SUM(Sales) AS TotalSales
FROM sales
GROUP BY Region;
结果:
Region | TotalSales |
---|---|
East | 300 |
West | 400 |
North | 150 |
使用聚合函数计算所有区域的总销售额:
sql
SELECT SUM(Sales) AS TotalSales
FROM sales;
结果:
TotalSales |
---|
850 |
二、 窗口函数:局部视角下的数据分析
窗口函数也称为分析函数,它允许我们在对数据进行分组的同时,保留每一行的原始数据,并在每个组内或特定窗口内进行计算。窗口函数不会折叠行,而是为每一行返回一个计算结果。
窗口函数的基本语法如下:
sql
function_name(arguments) OVER (PARTITION BY partition_expression ORDER BY order_expression [ROWS | RANGE window_frame])
function_name
:窗口函数名称,例如SUM()
,AVG()
,RANK()
,ROW_NUMBER()
等。OVER
子句:定义窗口的范围。PARTITION BY
:可选,指定分组列,类似于GROUP BY
。ORDER BY
:可选,指定排序列,用于排序窗口内的行。ROWS | RANGE window_frame
:可选,指定窗口框架,定义哪些行参与计算。
示例:
使用窗口函数计算每个区域内每个产品的销售额占比:
sql
SELECT Region, Product, Sales,
Sales * 100.0 / SUM(Sales) OVER (PARTITION BY Region) AS SalesPercentage
FROM sales;
结果:
Region | Product | Sales | SalesPercentage |
---|---|---|---|
East | A | 100 | 33.33 |
East | B | 200 | 66.67 |
West | A | 150 | 37.50 |
West | B | 250 | 62.50 |
North | A | 50 | 33.33 |
North | B | 100 | 66.67 |
在这个例子中,SUM(Sales) OVER (PARTITION BY Region)
计算了每个区域的总销售额,然后将每个产品的销售额除以该总额,得到销售额占比。可以看到,窗口函数保留了每一行的原始数据,并为每一行计算了销售额占比。
三、 区别与联系
区别:
- 返回值: 聚合函数返回单个值,而窗口函数为每一行返回一个值。
- 作用范围: 聚合函数作用于整个组或整个表,窗口函数作用于每个组内的窗口或整个表的窗口。
- 分组: 聚合函数通常与
GROUP BY
子句一起使用,窗口函数使用PARTITION BY
子句进行分组。 - 结果呈现: 聚合函数会折叠行,只保留聚合结果,窗口函数保留所有行,并添加新的计算列。
联系:
- 功能: 两者都是用于对数据进行汇总和计算的工具。
- 函数: 一些函数既可以作为聚合函数,也可以作为窗口函数,例如
SUM()
,AVG()
,COUNT()
等。 - 数据分析: 两者都常用于数据分析和报表生成。
四、 高级应用场景
- 移动平均: 使用窗口函数计算一段时间内的移动平均值,例如过去 7 天的平均销售额。
- 累计和: 使用窗口函数计算累计和,例如每个月的累计销售额。
- 排名: 使用
RANK()
,ROW_NUMBER()
等窗口函数对数据进行排名。 - 滞后和超前: 使用
LAG()
和LEAD()
窗口函数访问当前行的前一行或后一行的数据,例如计算销售额的环比增长率。
五、 总结
聚合函数和窗口函数是 SQL 中强大的数据分析工具,它们各有特点,适用于不同的场景。聚合函数用于全局视角下的数据汇总,而窗口函数用于局部视角下的数据分析。理解它们的区别和联系,能够帮助我们更好地利用 SQL 进行数据分析,并从数据中提取更有价值的信息。 选择使用哪种函数取决于你想要实现的目标以及你希望如何呈现结果。 如果需要对数据进行分组并计算每个组的汇总值,则应使用聚合函数;如果需要保留每一行的原始数据,并在每个组内或特定窗口内进行计算,则应使用窗口函数。 通过灵活运用这两种函数,可以更好地满足各种数据分析需求。