如何用ROW_NUMBER()筛选仅含'SEND Final'单条记录的ID
修正方案及问题分析
原代码存在的问题
GROUP BY Comment, ID逻辑错误:这种分组会把同一个ID下不同的Comment拆分成独立分组,无法统计该ID下的整体Comment类型分布,而且SELECT *与GROUP BY的列不匹配(多数SQL严格模式下会报错)。ROW_NUMBER()的使用未结合筛选逻辑:仅按ID分区并排序,只是给每个ID的行编号,无法过滤出仅含'SEND Final'且无'SEND Draft'的ID。
正确实现方式
方法一:先统计ID的Comment特征再筛选
这种方式逻辑清晰,先通过分组统计每个ID下的Draft和Final数量,再关联原表取出符合条件的记录:
WITH id_comment_stats AS ( SELECT ID, SUM(CASE WHEN Comment = 'SEND Draft' THEN 1 ELSE 0 END) AS draft_count, SUM(CASE WHEN Comment = 'SEND Final' THEN 1 ELSE 0 END) AS final_count FROM Mytable GROUP BY ID ) SELECT m.* FROM Mytable m JOIN id_comment_stats s ON m.ID = s.ID WHERE s.draft_count = 0 AND s.final_count = 1;
方法二:结合窗口函数实现(若需使用ROW_NUMBER)
如果必须用ROW_NUMBER(),可以先通过窗口函数统计每个ID的Comment特征,再筛选符合条件的记录:
WITH id_qualified AS ( SELECT ID, Comment, SUM(CASE WHEN Comment = 'SEND Draft' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) AS draft_count, SUM(CASE WHEN Comment = 'SEND Final' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) AS final_count, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Comment) AS rn FROM Mytable ) SELECT ID, Comment FROM id_qualified WHERE draft_count = 0 AND final_count = 1 AND rn = 1;
两种方法都能精准筛选出仅关联一条'SEND Final'且无'SEND Draft'的ID记录(比如示例中的ID3)。
内容的提问来源于stack exchange,提问作者Krasnips
相关产品推荐
相关产品推荐

