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

SQL中如何在CASE语句中使用DISTINCT实现pos4列值去重

解决方案

你的需求本质是每个唯一的keyword_id只返回一行记录,取对应符合范围的position拼接为指定格式,CASE语句本身无法实现去重,需要配合分组或窗口函数逻辑实现,以下是两种可行方案:


方案1:GROUP BY分组聚合(最简洁,适配你的预期输出)

直接按keyword_id分组,取每个分组的最小position即可:

SELECT CONCAT(MIN(pr.position), '-', pr.keyword_id) AS result
FROM project_reports pr
WHERE pr.position BETWEEN 4 AND 10
GROUP BY pr.keyword_id
ORDER BY pr.keyword_id;

执行后输出和你给出的预期完全一致:

4-1
7-2
5-3

方案2:窗口函数(扩展性更强,适配复杂逻辑)

如果你需要保留原查询的CASE逻辑,或者后续要新增更多字段返回,可以用ROW_NUMBER窗口函数做行级过滤:

WITH ranked_reports AS (
  SELECT
    pr.position,
    CASE WHEN pr.position BETWEEN 4 AND 10 THEN keyword_id ELSE NULL END AS pos4,
    -- 按keyword_id分组,每组内按position从小到大排序
    ROW_NUMBER() OVER (PARTITION BY keyword_id ORDER BY pr.position ASC) AS rn
  FROM project_reports pr
)
-- 取每个keyword_id排序第一的行,过滤掉position不符合范围的记录
SELECT CONCAT(position, '-', pos4) AS result
FROM ranked_reports
WHERE rn = 1 AND pos4 IS NOT NULL
ORDER BY pos4;

内容的提问来源于stack exchange,提问作者micager478

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:04