基于CASE语句筛选SQL数据行:实现优先获取ID的‘good’记录,无则返回‘bad’记录的方法
用CASE语句实现ID级别的优先级筛选需求
这个需求本质是按ID分组后的优先级取值——优先保留index='good'的记录,无则保留index='bad'的。结合CASE标记优先级,再配合窗口函数就能完美实现,我给你一步步拆解:
核心思路
- 用CASE给每条记录标记优先级:把
index='good'的记录设为最高优先级(比如数字1),index='bad'设为次优先级(数字2) - 按ID分组后,只保留每个组内优先级最高的那条记录
具体SQL实现
假设你的表名为your_table,包含id、index以及其他需要返回的业务字段(比如data_value),代码如下:
-- 先给每条记录按ID分组并标记优先级排名 WITH prioritized_records AS ( SELECT id, index, data_value, -- 替换成你的实际业务字段 -- 用CASE定义优先级,good排1,bad排2,再按这个排序取第一条 ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE WHEN index = 'good' THEN 1 ELSE 2 END ASC ) AS priority_rank FROM your_table ) -- 筛选每个ID下优先级最高的记录 SELECT id, index, data_value FROM prioritized_records WHERE priority_rank = 1;
代码解释
PARTITION BY id:确保我们是在每个ID的范围内做筛选CASE WHEN index = 'good' THEN 1 ELSE 2 END:给目标记录打上优先级标签,数字越小优先级越高ROW_NUMBER():会给每个ID下的记录按优先级排序编号,good记录会拿到priority_rank=1;如果某个ID只有bad记录,那它的编号就是1- 最后通过
WHERE priority_rank = 1,就能拿到每个ID符合要求的那条记录
扩展说明
如果同一个ID存在多条index='good'的记录,上面的代码会随机返回其中一条。如果需要指定返回某一条(比如最新创建的),可以在ORDER BY里追加排序字段:
ORDER BY CASE WHEN index = 'good' THEN 1 ELSE 2 END ASC, create_time DESC
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

