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

基于CASE语句筛选SQL数据行:实现优先获取ID的‘good’记录,无则返回‘bad’记录的方法

用CASE语句实现ID级别的优先级筛选需求

这个需求本质是按ID分组后的优先级取值——优先保留index='good'的记录,无则保留index='bad'的。结合CASE标记优先级,再配合窗口函数就能完美实现,我给你一步步拆解:

核心思路

  1. 用CASE给每条记录标记优先级:把index='good'的记录设为最高优先级(比如数字1),index='bad'设为次优先级(数字2)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:29:07