窗口函数:允许对一组行执行计算,这些行与当前行有某种关系。
窗口函数与聚合函数不同,聚合函数会将多行合并为单行,而窗口函数会保留原始数据集中的每一行,只是在计算时考虑一个由“窗口”定义的数据子集。
窗口函数通常用于执行以下操作:
1. 计算运行总计:如累计和、累积平均值等。
2. 排名:如行号、百分比排名等。
3. 分析:如移动平均、移动总和等。
4. 比较:如前后对比、差分等。
窗口函数的语法通常包括:
1. OVER() 子句:定义了窗口函数操作的数据范围和排序方式。
2. PARTITION BY 子句(可选):用于将数据集划分为多个独立的窗口,每个窗口内部可以独立计算。
3. ORDER BY 子句(在 OVER() 中):定义了窗口内数据的排序方式。
以下是一些常用的窗口函数:
1. ROW_NUMBER():为窗口内的每一行分配一个唯一的连续整数。
2. RANK():为窗口内的每一行分配一个排名,相同值会分配相同的排名,后续排名会有间隔。
3. DENSE_RANK():为窗口内的每一行分配一个排名,相同值会分配相同的排名,后续排名不会间隔。
4. LEAD() 和 LAG():分别用于访问当前行之前的行和之后的行的数据。
5. SUM()、AVG()、MIN()、MAX():计算窗口内的数据总和、平均值、最小值和最大值。
窗口函数案例
这里采用牛客网中的一道SQL题作为介绍:
本题为SQL222 对所有员工的薪水按照salary降序进行1-N的排名。
题目如下:
解析过程
在本题中,虽然是SQL的困难题,但是从题目中可以知道几个点:
1. 按照salary降序且进行1-N的排序,也就是说可以考虑窗口函数
2. 这里涉及到了两个排序,因此考察的是多列下的排序情况
在上一篇文章中,我们知道ORDER BY函数在多列排序下,是允许我们在第一列的值相同时,根据第二列(或更多列)进行进一步排序。因此,也符合本题的要求。
综上所述,本题的解题思路如下:
1. 利用窗口函数: DENSE_RANK() 函数进行计算
2. 针对选取的内容进行多列排序
```
SELECT
emp_no,
salary,
DENSE_RANK() OVER (
ORDER BY
salary DESC
) AS t_rank
FROM
salaries
ORDER BY
t_rank ASC,
emp_no ASC;
```
PS:关于SQL的相关知识就更新到这里啦~~~
接下来我每天会分享我在刷SQL过程中遇到的题目。SQL还是需要多写写代码才能印象深刻哦~~~
我是文熠,一个正在找工作的95后算法工程师