推荐答案
SQL 中常用的窗口函数包括:
- ROW_NUMBER(): 为每一行分配一个唯一的序号,从1开始。
- RANK(): 为每一行分配一个排名,相同的值会有相同的排名,后续排名会跳过。
- DENSE_RANK(): 类似于
RANK(),但不会跳过后续排名。 - NTILE(n): 将结果集分成
n个桶,并为每一行分配一个桶号。 - LAG(column, offset, default): 返回当前行之前的某一行的值,
offset指定向前偏移的行数,default为默认值。 - LEAD(column, offset, default): 返回当前行之后的某一行的值,
offset指定向后偏移的行数,default为默认值。
本题详细解读
ROW_NUMBER()
ROW_NUMBER() 函数为每一行分配一个唯一的序号,通常用于生成行号或分页查询。例如:
SELECT
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
employee_id,
salary
FROM employees;RANK()
RANK() 函数为每一行分配一个排名,相同的值会有相同的排名,后续排名会跳过。例如:
SELECT
RANK() OVER (ORDER BY salary DESC) AS rank,
employee_id,
salary
FROM employees;DENSE_RANK()
DENSE_RANK() 函数类似于 RANK(),但不会跳过后续排名。例如:
SELECT
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,
employee_id,
salary
FROM employees;NTILE(n)
NTILE(n) 函数将结果集分成 n 个桶,并为每一行分配一个桶号。例如:
SELECT
NTILE(4) OVER (ORDER BY salary DESC) AS bucket,
employee_id,
salary
FROM employees;LAG(column, offset, default)
LAG() 函数返回当前行之前的某一行的值。offset 指定向前偏移的行数,default 为默认值。例如:
SELECT
LAG(salary, 1, 0) OVER (ORDER BY employee_id) AS previous_salary,
employee_id,
salary
FROM employees;LEAD(column, offset, default)
LEAD() 函数返回当前行之后的某一行的值。offset 指定向后偏移的行数,default 为默认值。例如:
SELECT
LEAD(salary, 1, 0) OVER (ORDER BY employee_id) AS next_salary,
employee_id,
salary
FROM employees;