SQL窗口函数实战:3个场景让你彻底搞懂ROW_NUMBER/RANK/SUM OVER

0 阅读1分钟

引言

数据分析师每天都在和SQL打交道,但很多人写了5年的SQL,依然不知道窗口函数的存在。

今天船长不讲概念,直接用3个真实业务场景,让你彻底搞懂SQL窗口函数。

场景一:用户最近7天购买频次排名

业务需求:找出每个用户在过去7天内的购买次数,并按次数降序排列。

SELECT 
    user_id,
    purchase_cnt,
    ROW_NUMBER() OVER (ORDER BY purchase_cnt DESC) as rnk
FROM (
    SELECT 
        user_id,
        COUNT(*) as purchase_cnt
    FROM orders
    WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
    GROUP BY user_id
) t

ROW_NUMBER():为每一行分配一个唯一的序号,相同值也不会重复。

场景二:部门内员工薪资排名

业务需求:按部门分组,计算每个员工的薪资在部门内的排名。

SELECT 
    emp_name,
    dept_name,
    salary,
    RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) as dept_rank
FROM employees

RANK():相同值排名相同,但下一个排名会跳跃。比如:1,1,3。

场景三:累计销售额计算

业务需求:计算每日销售额的累计值,便于观察增长趋势。

SELECT 
    order_date,
    daily_sales,
    SUM(daily_sales) OVER (ORDER BY order_date) as cum_sales
FROM daily_sales_summary

SUM() OVER():计算累计值,不需要JOIN自己,非常高效。

总结

窗口函数的核心就三要素:

  • PARTITION BY:分组

  • ORDER BY:排序

  • ROWS/RANGE:窗口大小

记住这三点,任何窗口函数都能手到擒来。