SQL:窗口函数

窗口函数:允许对一组行执行计算,这些行与当前行有某种关系。

窗口函数与聚合函数不同,聚合函数会将多行合并为单行,而窗口函数会保留原始数据集中的每一行,只是在计算时考虑一个由“窗口”定义的数据子集。

窗口函数通常用于执行以下操作:

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后算法工程师

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容