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 与窗口帧,默认窗口帧不一定等于整组。去重时也可先按业务键分区、选择保留顺序,再审核要删除的记录;不要把排名查询直接当作已验证的删除方案。