PostgreSQL查询:如何筛选不存在'Ended'状态的EventID
PostgreSQL查询实现方案
假设你的数据表名为event_status,你可以用以下两种常见方式实现需求:
方案1:NOT EXISTS实现(推荐,大数据量下性能更好)
SELECT DISTINCT EventID FROM event_status es1 WHERE NOT EXISTS ( SELECT 1 FROM event_status es2 WHERE es2.EventID = es1.EventID AND es2.Status = 'Ended' );
逻辑说明:遍历所有EventID,排除掉存在对应「Status为Ended的记录」的EventID,DISTINCT用于对结果去重,避免同一个EventID返回多条重复记录。
方案2:GROUP BY+聚合判断实现(写法更简洁)
SELECT EventID FROM event_status GROUP BY EventID HAVING COUNT(*) FILTER (WHERE Status = 'Ended') = 0;
逻辑说明:按EventID分组后,统计每个分组内Status为Ended的记录数量,筛选出数量为0的分组,也就是从未出现过Ended状态的EventID。这里用了PostgreSQL特有的FILTER语法来简化聚合条件的写法,如果你需要兼容其他数据库,可以把COUNT(*) FILTER (WHERE Status = 'Ended')替换成COUNT(CASE WHEN Status = 'Ended' THEN 1 END)。
两种方案执行后都会返回你预期的结果:2、3。
内容的提问来源于stack exchange,提问作者user4587
相关产品推荐
相关产品推荐

