PostgreSQL查询无'update'事件的唯一ticket_id方法
问题描述
现有数据表结构及数据如下:
id ticket_id event 1 130 response 2 130 query 3 130 create 4 130 update 5 131 response 6 131 query 7 131 create 8 132 response 9 132 query 10 132 create
需要在PostgreSQL中查询出event字段从未出现'update'值的唯一ticket_id,预期返回结果为131和132。
解法1:使用NOT EXISTS子查询
这是逻辑最直观的写法,多数场景下性能表现稳定:
SELECT DISTINCT ticket_id FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.ticket_id = t1.ticket_id AND t2.event = 'update' );
思路
遍历每条记录对应的ticket_id,检查该ticket_id下是否存在event = 'update'的条目。如果不存在则保留该ticket_id,DISTINCT确保最终结果中每个ticket_id只出现一次。
解法2:使用GROUP BY + HAVING
适合结合聚合统计的场景,写法简洁:
SELECT ticket_id FROM your_table GROUP BY ticket_id HAVING COUNT(CASE WHEN event = 'update' THEN 1 END) = 0;
思路
按ticket_id分组后,统计每组中满足event = 'update'的记录数量。当统计数为0时,说明该ticket_id没有任何'update'事件,符合筛选条件。
解法3:使用EXCEPT集合运算
利用PostgreSQL的集合差集特性实现,语义清晰:
SELECT DISTINCT ticket_id FROM your_table EXCEPT SELECT ticket_id FROM your_table WHERE event = 'update';
思路
先获取所有存在的ticket_id集合,再减去包含'update'事件的ticket_id集合,最终得到的差集就是从未出现'update'的ticket_id。
内容的提问来源于stack exchange,提问作者Jerome Asilo
相关产品推荐
相关产品推荐

