You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ROW_NUMBER()筛选仅含'SEND Final'单条记录的ID

修正方案及问题分析

原代码存在的问题

  1. GROUP BY Comment, ID 逻辑错误:这种分组会把同一个ID下不同的Comment拆分成独立分组,无法统计该ID下的整体Comment类型分布,而且SELECT *与GROUP BY的列不匹配(多数SQL严格模式下会报错)。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:07:23