窗口函数是使用 SQL 进行数据查询和分析时经常使用的函数,基本语法为:
<窗口函数> over ( partition by <分组的列名> order by <排序的列名>)
其中窗口函数又分为专用窗口函数和聚合函数。
专用窗口函数包括 row_number(), rank() dense_rank() 等,比较常用,这里不做过多介绍。
而聚合函数 max(), min(), sum(), count() 等在作为窗口函数使用的时候,需要注意以下事项:
(1)聚合函数需要指定聚合的列名;
(2)当聚合函数只用了 partition by,没使用 order by 时,聚合函数计算按照每个分区全部数值计算;
(3)当聚合函数同时使用 partition by 和 order by 时,聚合函数计算按照逐行叠加。
以下员工薪水表 Employee,和 sum() 函数为例:
Id | Company | Salary |
1 | A | 2341 |
2 | A | 341 |
3 | A | 15 |
4 | A | 13 |
5 | B | 351 |
6 | B | 44 |
select Id, Company, Salary, Sum(Salary) over(Partition by Company) as AllSalary from Employee
这个的结果是:
Id | Company | Salary | AllSalary |
1 | A | 2341 | 2710 |
2 | A | 341 | 2710 |
3 | A | 15 | 2710 |
4 | A | 13 | 2710 |
5 | B | 351 | 395 |
6 | B | 44 | 395 |
很明显,这里类似于使用 group by 之后,对每一个分组进行一次 sum 计算,只是同一个分组下每一行都计算了相同的一次。
select Id, Company, Salary, Sum(Salary) over(Partition by Company, order by Id) as AccSalary from Employee
这个结果是:
Id | Company | Salary | AccSalry |
1 | A | 2341 | 2341 |
2 | A | 341 | 2682 |
3 | A | 15 | 2697 |
4 | A | 13 | 2710 |
5 | B | 351 | 351 |
6 | B | 44 | 395 |
这种计算则是对这一行之前的数据进行聚合计算,这种计算方式很适合用于统计一些累加的数据分析。