技术问询:重复记录去重,仅提取状态为A的特定记录
问题场景
有一组重复记录,仅status列的值不同(分别为A和B):
| record | status |
|---|---|
| XXXXXXXXXX | A |
| XXXXXXXXXX | B |
需求
只保留状态为A的记录,移除对应的状态为B的重复记录。
现有SQL的问题
你提供的SQL片段存在语法错误,且逻辑无法实现需求:
Select record case when status in ('a', 'b') then ('a') from xyz
这段SQL缺少END来闭合CASE语句,且仅试图将状态统一改为A,没有处理去重过滤的核心逻辑。
可行解决方案
方案1:直接筛选状态为A的记录
如果需求仅为获取状态为A的记录,直接添加WHERE条件即可:
SELECT record, status FROM xyz WHERE status = 'A';
方案2:分组优先保留A状态
如果同一record存在多状态,但需优先保留A(无论是否有B),可使用分组聚合:
SELECT record, MAX(status) AS status FROM xyz WHERE status IN ('A', 'B') GROUP BY record;
注:由于'A'的ASCII码大于'B',MAX(status)会自动返回A;若使用小写的'a'和'b',该逻辑同样适用。
方案3:窗口函数精准筛选
如果需要更灵活的优先级逻辑,可通过窗口函数排序后取第一条:
WITH ranked_records AS ( SELECT record, status, ROW_NUMBER() OVER (PARTITION BY record ORDER BY CASE WHEN status = 'A' THEN 1 ELSE 2 END) AS rn FROM xyz WHERE status IN ('A', 'B') ) SELECT record, status FROM ranked_records WHERE rn = 1;
内容的提问来源于stack exchange,提问作者Mridul Bhardwaj
相关产品推荐
相关产品推荐

