一 什么是SQL窗口函数?
SQL窗口函数说的是在查询现有的结果集的特定“窗口”(即数据集的一个分区或整个结果集)再作处理统计(排序,聚合统计,如count,sum等),最简单的理解就是执行两次sql,第二次执行sql是在第一次的sql查询数据上进行。
二 sql窗口函数的组成
sql窗口函数的组成: 聚合函数(或者窗口函数) + over 两部分组成,如下图:
<聚合函数 或者 窗口函数> OVER ([PARTITION BY <列名>] ORDER BY <排序用列名>)
第一部分:聚合函数(或者窗口函数)
- 聚合函数:SUM、MAX、MIN、AVG等
- 专用窗口函数:RANK、DENSE_RANK等排序用的
第二部分: over
- PARTITON BY 分组,即选择要看哪个窗口,与GROUP BY 相似,但是PARTITION BY 子句并不具备GROUP BY 子句的汇总功能,不会变更或影响数据表中记录的行数。
- ORDER BY是用来排序,即决定窗口内,是按那种规则(字段)来排序的。
三 SQL窗口函数使用
1 使用sql窗口函数排名统计:
SELECT id, value,ROW_NUMBER() OVER (ORDER BY value ASC) AS row_num
FROM table_name;
2 使用 sql窗口聚合函数:
SELECT department_id, salary,avg(salary) OVER (PARTITION BY department_id) AS avg_salary
FROM employees;
根据部门id统计部门的平均薪资。
3 环比统计(取前,取后)
SELECT sale_date,sales_amount,(sales_amount - LAG(sales_amount, 1) OVER (ORDER BY sale_date)) AS daily_change,(sales_amount / LAG(sales_amount, 1) OVER (ORDER BY sale_date)) - 1 AS percentage_change
FROM order;
LAG(sales_amount, 1)
获取的是前一天的销售额。(sales_amount - LAG(sales_amount, 1) OVER (ORDER BY sale_date))
计算的是每日销售额与前一天销售额的差额,即日环比绝对增量。(sales_amount / LAG(sales_amount, 1) OVER (ORDER BY sale_date)) - 1
计算的是日环比增长率,即当前销售额相较于前一天的增长百分比。
四 总结
现在很多报表都要求有环比数据,小项目,或数据量小的情况下,使用窗口函数是个不错的选择。