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
相关产品推荐
相关产品推荐

