查询public.message表中仅出现一次的subject_key
问题分析与解决方案
你的SQL查询问题出在使用row_number()窗口函数的逻辑上:row_number()会给每个subject_key分组内的行依次编号,哪怕某个subject_key对应100条记录,分组里的第一条记录rn依然是1。所以你的查询会返回所有subject_key的至少一条记录,而不是仅出现一次的subject_key。
正确的查询方案
方案1:使用GROUP BY + HAVING(最直接高效)
SELECT subject_key FROM public.message GROUP BY subject_key HAVING COUNT(*) = 1 LIMIT 10;
这个方案通过分组统计每个subject_key的总记录数,只保留统计结果等于1的subject_key。
方案2:使用COUNT()窗口函数
如果你想保留窗口函数的写法,可以用COUNT()替代row_number():
WITH cte AS ( SELECT subject_key, COUNT(*) OVER (PARTITION BY subject_key) AS total_count FROM public.message ) SELECT DISTINCT subject_key FROM cte WHERE total_count = 1 LIMIT 10;
这里窗口函数COUNT(*) OVER (PARTITION BY subject_key)会计算每个subject_key对应的总记录数,之后筛选总记录数为1的条目,用DISTINCT确保每个subject_key只返回一次。
内容的提问来源于stack exchange,提问作者D. Hoffman
相关产品推荐
相关产品推荐

