SQL Window Function

本文介绍了SQL中的窗口函数,包括分析函数的三种类型:聚合函数、导航函数和编号函数,以及PARTITION BY和ORDER BY子句的用法。通过实例展示了GROUP BY与OVER(PARTITION BY)的区别,并探讨了排序的三种方式,包括允许并列和不允许并列的情况。
摘要由CSDN通过智能技术生成

1. 窗口函数

窗口函数(window (analytical) functions): 简单的说, 就是在每一个窗口上进行分析操作。 窗口就是一个行的集合。分析操作就是一些聚合操作。

2. 语法

<Function> OVER ( [PARTITION BY <col...>]
                   ORDER BY <col...>
                  [ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING]) 

在这里插入图片描述

2.1 分析函数(Analytical function)

Three types of analytical functions:

  • Analytic aggregate functions:SUM(), AVG(), COUNT(), MAX(), MIN()

  • Analytic navigation functions:FIRST_VALUE(), LAST_VALUE(), LEAD(), LAG()

  • FIRST_VALUE()/LAST_VALUE(): 窗口第一条/最后一条LEAD()/LAG():随后一条/前面一条
  • Analytic numbering functions: RANK(), DENSE_RANK(), ROW_NUMBER()

RANK(), DENSE_RANK() 存在并列,ROW_NUMBER()不存在并列,前两者的区别是RANK()会跳过相同的排位,即排名会不连续,如1,1,3.

2.2 PARTITION BY & ORDER BY

PARTITION BY: 决定横向分组,类似与GROUP BY的作用,即按照某个属性分为一类。非必须,如果没有则把整个当成一个partition。

ORDER BY: 决定纵向排序,即在每一个partition中如何排序。

2.4 ROWS

ROWS:窗口框架(Window Framework Clauses), 即在每一个窗口中再限定范围。

比如:

  • ROWS 2 PRECEDING: 前两行
  • ROWS 2 FOLLOWING: 后两行
  • ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING: 前后两行
  • ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING:当前partition中所有行。

3. 用法举例

3.1 GROUP BY vs OVER(PARTITION BY)

GROUP BY: 相当于汇总, 只返回一条数据。
PARTITION BY: 为每一行返回一个窗口内分析/聚合函数的值。

GROUP BY

mysql> SELECT AVG(salary)
    -> FROM salaries;
+-------------+
| AVG(salary) |
+-------------+
|  64904.4945 |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT emp_no, AVG(salary)
    -> FROM salaries
    -> GROUP BY emp_no;
+--------+-------------+
| emp_no | AVG(salary) |
+--------+-------------+
|  10001 |  75388.9412 |
|  10002 |  72527.0000 |
|  10003 |  43030.2857 |
|  10004 |  56512.2500 |
|  10005 |  87275.7692 |
|  10006 |  43311.0000 |
|  10007 |  70826.7143 |
|  10008 |  49307.6667 |
|  10009 |  63437.6667 |
+--------+-------------+
9 rows in set (0.00 sec)

PARTITION BY

mysql> SELECT AVG(salary) OVER()
    -> FROM salaries;
+--------------------+
| AVG(salary
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值