SQL窗口函数

一  什么是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 计算的是日环比增长率,即当前销售额相较于前一天的增长百分比。

四 总结

  现在很多报表都要求有环比数据,小项目,或数据量小的情况下,使用窗口函数是个不错的选择。 

 

你可能感兴趣的:(sql,java,数据库)