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

Redshift中使用LISTAGG拼接字符串并筛选特定项目的问题

解决按ID筛选并拼接项目的问题

你之前的SQL逻辑错误在于:只单独过滤了每条记录的项目值,没有从ID维度判断该ID下是否存在'c'。比如ID=1虽然包含'a',但同时也有'c',你的语句会保留ID=1中的'a'和'b'(或只保留'a'),但实际上需要完全排除这个ID。

正确解法1:使用HAVING子句直接筛选ID

通过分组后的条件判断,确保ID满足「包含'a'且不包含'c'」的要求,再拼接所有项目:

SELECT
  id,
  LISTAGG(project, ',') WITHIN GROUP (ORDER BY project) AS project
FROM project
GROUP BY id
HAVING COUNT(CASE WHEN project = 'a' THEN 1 END) > 0
   AND COUNT(CASE WHEN project = 'c' THEN 1 END) = 0;
  • COUNT(CASE WHEN project = 'a' THEN 1 END) > 0:统计当前ID下'a'出现的次数,大于0说明包含'a'
  • COUNT(CASE WHEN project = 'c' THEN 1 END) = 0:统计当前ID下'c'出现的次数,等于0说明完全不包含'c'

正确解法2:先筛选符合条件的ID再关联拼接

如果需要更清晰的逻辑,可以先通过子查询找出所有符合要求的ID,再关联原表拼接项目:

SELECT
  p.id,
  LISTAGG(p.project, ',') WITHIN GROUP (ORDER BY project) AS project
FROM project p
JOIN (
  SELECT id
  FROM project
  GROUP BY id
  HAVING COUNT(CASE WHEN project = 'a' THEN 1 END) > 0
     AND COUNT(CASE WHEN project = 'c' THEN 1 END) = 0
) valid_ids ON p.id = valid_ids.id
GROUP BY p.id;

为什么你的原有语句失效?

  • 语句1和2:WHERE子句只保留了项目为'a'且不是'c'的记录,分组后ID=1会只拼接'a',但没有排除整个ID(因为该ID存在'c')
  • 语句3:子查询仅筛选出项目为'a'的记录,同样没有从ID维度排除包含'c'的情况,最终ID=1仍会被保留并拼接'a'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:50:39