SQL 窗口函数

sql/window_functions2026-10-16 18:03:59

SQL 窗口函数在保留每行结果的同时,对其所在分组或窗口进行排名、累计及相邻行计算,不像 GROUP BY 那样把每组折叠成一行。

每组前 N 名

以下示例假定 employee 含 department_id、salary、id 三列:

SELECT * FROM (
  SELECT id, department_id, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department_id
           ORDER BY salary DESC, id
         ) AS rn
  FROM employee
) AS ranked
WHERE rn <= 3;

ROW_NUMBER 为每行分配序号,示例用 id 消除同薪排序歧义;如需并列名次,应根据业务选择 RANK 或 DENSE_RANK。

窗口范围

累计聚合要明确 ORDER BY 与窗口帧,默认窗口帧不一定等于整组。去重时也可先按业务键分区、选择保留顺序,再审核要删除的记录;不要把排名查询直接当作已验证的删除方案。

参考资料

本页目录