mysql窗口函数
https://blog.csdn.net/a1037/article/details/152871873
普通聚合函数 group by,把多行数据聚合成单个结果行
窗口函数是 over子句 定义计算窗口,用于排名、累计求和、前后行数据对比的场景,为查询结果集中每一行返回一个值
排名函数
生成唯一连续序号 row_number(); 并列排名后跳过序号(1,1,3)rank(); 并列排名后不跳过序号(1,1,2)dense_rank()
例:每个部门内员工的工资排序。按department部门分区并按工资排序
RANK()会显示:1, 1, 3(跳号)DENSE_RANK()显示:1, 1, 2(连续不跳号)
-- 查询员工表中的姓名、部门、薪水以及每个部门内按薪水降序排列的排名
SELECT
name, -- 选择员工姓名
department, -- 选择员工所属部门
salary, -- 选择员工薪水
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_salary_rank -- 计算每个部门内按薪水降序排列的排名,并命名为dept_salary_rank
FROM
employees; -- 从employees表中获取数据
聚合窗口函数
sum avg count ,保留明细的同时,计算分组汇总信息(每个部门平均薪资并显示在每位 员工记录旁)
例:计算每个员工工资,占其所在的部门总工资的,百分比
SELECT
name, -- 选择员工姓名
department, -- 选择员工所属部门
salary, -- 选择员工薪水
dept_total, -- 使用之前计算的部门总工资
ROUND((salary / dept_total) * 100, 2) AS salary_percentage -- 计算每个员工在其所在部门的薪水占比,并保留两位小数
FROM (
SELECT
name, -- 选择员工姓名
department, -- 选择员工所属部门
salary, -- 选择员工薪水
SUM(salary) OVER (PARTITION BY department) AS dept_total -- 计算每个部门的总工资
FROM
employees -- 从employees表中获取数据
) AS subquery;
偏移函数-->环比
获取当前行之前,第n行的值 lag( expr , n )
获取当前行之后,第n行的值 lead( expr , n )
例:计算每日销售额与前一天销售额的差值,日环比 ( amount - pre_amount ) --差额为0除完为0,没有前一天时设置差额为0 / pre_amount --前一天金额0或者null
SELECT
date, -- 选择日期
amount, -- 选择当前金额
IFNULL(amount - LAG(amount, 1) OVER (ORDER BY date ASC), 0) AS growth, -- 计算增长额,如果差值为NULL则返回0
ROUND(
CASE
WHEN LAG(amount, 1) OVER (ORDER BY date ASC) = 0 OR LAG(amount, 1) OVER (ORDER BY date ASC) IS NULL THEN 0 -- 如果前一个金额为0或NULL,则返回0
ELSE ((amount - LAG(amount, 1) OVER (ORDER BY date ASC)) * 1.0 / LAG(amount, 1) OVER (ORDER BY date ASC)) * 100 -- 否则计算增长率,并转换为百分比形式
END,
2
) AS growth_rate -- 四舍五入并保留两位小数
FROM
daily_sales -- 从daily_sales表中获取数据
ORDER BY
date ASC; -- 按日期升序排列结果
分布函数
percent_rank() 计算每行 在其分区内的百分比排名
cume_dist() 计算累积分布

浙公网安备 33010602011771号