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

