You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:21