请详细讲解下sql窗口函数,以及具体用法
时间: 2023-07-15 18:13:42 浏览: 360
SQL中窗口函数的使用
SQL 窗口函数(Window Function)是一种特殊的 SQL 函数,它可以对查询结果的每一行数据进行计算,并且可以根据指定的排序方式来定义窗口(Window),从而实现对特定数据范围内的计算。
SQL 窗口函数的语法格式如下:
```
<窗口函数>([<表达式>] [OVER <PARTITION BY> <分区列> [ORDER BY <排序列> [ASC|DESC]]])
```
其中,`<窗口函数>` 表示需要使用的窗口函数名称,`<表达式>` 表示需要计算的列或表达式,`<PARTITION BY>` 表示需要分区的列,`<分区列>` 表示需要分区的列名,`<ORDER BY>` 表示需要排序的列,`<排序列>` 表示需要排序的列名,`ASC|DESC` 表示排序方式。
常用的 SQL 窗口函数包括:
- `ROW_NUMBER()`:为每一行数据分配一个唯一的行号。
- `RANK()`:为每一行数据分配排名,相同的值分配相同的排名。
- `DENSE_RANK()`:为每一行数据分配排名,相同的值分配相同的排名,但是排名不会有空缺。
- `NTILE(<n>)`:将数据分成 n 份,返回每一行数据所在的分组编号。
- `LAG(<表达式>[, <偏移量>[, <默认值>]])`:返回当前行前面第 n 行的数据。
- `LEAD(<表达式>[, <偏移量>[, <默认值>]])`:返回当前行后面第 n 行的数据。
- `SUM() OVER()`:计算指定列的累计和。
- `AVG() OVER()`:计算指定列的平均值。
- `MAX() OVER()`:计算指定列的最大值。
- `MIN() OVER()`:计算指定列的最小值。
下面是一个例子,展示如何使用 SQL 窗口函数:
```
SELECT
department_id,
last_name,
salary,
AVG(salary) OVER(PARTITION BY department_id ORDER BY salary DESC) as avg_salary
FROM
employees
ORDER BY
department_id ASC,
salary DESC;
```
在这个例子中,我们使用了 `AVG()` 窗口函数来计算每个部门员工的薪资平均值。通过 `PARTITION BY` 指定分区列为 `department_id`,表示需要按照部门分组计算平均值。同时,我们还使用了 `ORDER BY` 指定排序列为 `salary DESC`,表示需要按照薪资倒序排列。最终的查询结果会按照部门 ID 升序排列,每个部门内的员工按照薪资倒序排列,并且在每个部门内计算出薪资的平均值。
阅读全文