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() 计算累积分布

 

posted @ 2026-04-24 10:42  香草奶油  阅读(2)  评论(0)    收藏  举报