“窗口”可理解为记录集合。“窗口函数”可理解为在满足某种条件的记录集合上执行的特殊函数,对于每条记录都要在此窗口内执行。
通过举例,快速理解窗口函数。
1)创建表 user,表 user 的数据如下:
mysql> select * from user;
+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| id | name | address | createtime |
+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
| 1 | aa | cun | 2020‐06‐01 00:00:00 |
| 2 | bb | cun | 2020‐06‐01 00:00:00 |
| 3 | bb | shi | 2020‐06‐01 01:00:00 |
| 4 | bb | shi | 2020‐06‐01 01:00:00 |
| 5 | cc | cun | 2020‐06‐01 01:00:00 |
| 6 | tt | cun | 2020‐06‐03 01:00:00 |
| 7 | eee | cun | 2020‐06‐04 01:00:00 |
| 8 | eee | cun | 2020‐06‐04 01:00:00 |
| 9 | xx | shen | 2020‐06‐02 01:00:00 |
+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+
9 rows in set (0.00 sec)
2)窗口函数的使用
SELECT createtime,
row_number() over(order by createtime) AS cr
FROM user ;
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+
| createtime | ll |
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+
| 2020‐06‐01 00:00:00 | 1 |
| 2020‐06‐01 00:00:00 | 2 |
| 2020‐06‐01 01:00:00 | 3 |
| 2020‐06‐01 01:00:00 | 4 |
| 2020‐06‐01 01:00:00 | 5 |
| 2020‐06‐02 01:00:00 | 6 |
| 2020‐06‐03 01:00:00 | 7 |
| 2020‐06‐04 01:00:00 | 8 |
| 2020‐06‐04 01:00:00 | 9 |
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+
9 rows in set (0.00 sec)
row_number() over(order by createtime) as cr 这部分为窗口函数。over(order by createtime)为窗口规范,函数 row_number() 即对窗口的数据进行编号。所以上述 sql 的意思为:先对 createtime 进行排序,然后对每行数据进行编号。