窗口函數(shù)不改變?cè)紨?shù)據(jù),只在原表上新增字段,并在新增字段實(shí)現(xiàn)結(jié)果,為每一行都返回一個(gè)結(jié)果。
一、排名窗口函數(shù)
row_number() over(partition by xxx order by xxx desc/asc) 窗口內(nèi)記錄的唯一序號(hào),沒(méi)有重復(fù)值
rank() over(partition by xxx order by xxx desc/asc) 排名,存在并列名次,跳躍排名
dense_rank() over(partition by xxx order by xxx desc/asc) 排名,存在并列名次,但是不跳躍
二、聚合窗口函數(shù)
avg() over(partition by xxx order by xxx desc/asc) 平均值
sum() over(partition by xxx order by xxx desc/asc) 求和
count() over(partition by xxx order by xxx desc/asc) 計(jì)數(shù)
max() over(partition by xxx order by xxx desc/asc) 最大
min() over(partition by xxx order by xxx desc/asc) 最小
三、取值窗口函數(shù)
first_value() over(partition by xxx order by xxx desc/asc) 窗口內(nèi)的第一條記錄的值
last_value() over(partition by xxx order by xxx desc/asc) 窗口內(nèi)的最后一條記錄的值
nth_value(col, n) 窗口內(nèi)第n行記錄的值
lag(col, n) 向前取第n行的值(默認(rèn)是前一行)
lead(col, n) 向后取第n行的值(默認(rèn)是后一行)
例1:查看每位員工比前一位員工的工資多多少?
SELECT
employee_id,
salary,
LAG(salary) OVER (ORDER BY hire_date) AS previous_salary, --取當(dāng)前行前一行的salary
salary - LAG(salary) OVER (ORDER BY hire_date) AS salary_diff --當(dāng)前行和前一行的diff
FROM employees;
例2: 每個(gè)部門中,展示該部門最早入職員工的薪資。
SELECT
employee_id,
department_id,
salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS first_salary
FROM employees;
浙公網(wǎng)安備 33010602011771號(hào)