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

PostgreSQL子查询失效:如何筛选非Active且取最大结束日期的记录?

嘿,我来帮你解决这个PostgreSQL的需求问题!针对你要剔除Active状态记录,再提取每个人员结束日期最大的那条的name和sub status的需求,除了子查询,这两个方法应该能帮到你:

方法1:用窗口函数ROW_NUMBER()

这是处理这类“分组取最值”场景的通用方案,逻辑清晰不容易出错:

WITH ranked_records AS (
    SELECT
        name,
        sub_status,
        end_date,
        -- 按name分组,每组内按结束日期倒序排,给每条记录打行号
        ROW_NUMBER() OVER (PARTITION BY name ORDER BY end_date DESC) AS rn
    FROM your_table_name
    WHERE status != 'Active' -- 先剔除Active状态的记录
)
-- 取每组里行号为1的(也就是结束日期最大的那条)
SELECT name, sub_status
FROM ranked_records
WHERE rn = 1;

方法2:用PostgreSQL专属的DISTINCT ON

如果你追求简洁的写法,PostgreSQL的DISTINCT ON特性简直是为这个场景量身定做的:

SELECT DISTINCT ON (name)
    name,
    sub_status
FROM your_table_name
WHERE status != 'Active'
-- 先按name分组,再按结束日期倒序,确保每个name只返回最新的那条
ORDER BY name, end_date DESC;

另外,顺便提一下你之前子查询没成功的可能原因:如果你的子查询里没在内部也过滤Active状态,那可能会取到某个人员Active状态的最大日期,导致最终匹配不到非Active的记录。正确的子查询写法应该是这样的:

SELECT name, sub_status
FROM your_table_name t
WHERE status != 'Active'
AND end_date = (
    SELECT MAX(end_date)
    FROM your_table_name
    WHERE name = t.name
    AND status != 'Active' -- 这里必须也过滤Active状态
);

内容的提问来源于stack exchange,提问作者moikoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:04:37