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
相关产品推荐
相关产品推荐

