PostgreSQL中如何在rank()函数中不统计重复空值?
解决PostgreSQL窗口函数排名排除空值的问题
要实现空值不纳入排名统计,让非空薪资的员工从正确位次开始排名,可使用PostgreSQL的FILTER子句限定窗口函数仅处理薪资非空的行,具体修改如下:
SELECT company.name, e.last_name, e.salary, -- 仅对salary非空的行计算排名 rank() OVER (ORDER BY e.salary) FILTER (WHERE e.salary IS NOT NULL) AS salary_rank FROM company LEFT JOIN employee e ON e.company_id = company.id ORDER BY company.name;
补充说明:
FILTER (WHERE e.salary IS NOT NULL)会让rank()仅针对薪资非空的记录计算排名,空值行的salary_rank会显示为NULL,不会占用有效排名位次。- 如果需要给空值行设置特定标识(比如
0),可结合CASE语句调整:SELECT company.name, e.last_name, e.salary, CASE WHEN e.salary IS NOT NULL THEN rank() OVER (ORDER BY e.salary) FILTER (WHERE e.salary IS NOT NULL) ELSE 0 -- 替换为你需要的标识 END AS salary_rank FROM company LEFT JOIN employee e ON e.company_id = company.id ORDER BY company.name; - 若需求是连续不跳跃的排名(相同薪资员工共享位次,下一位次连续递增),将
rank()替换为dense_rank()即可。
内容的提问来源于stack exchange,提问作者Matvey Chukhno
相关产品推荐
相关产品推荐

