如果组中至少有一行与foo
匹配,我希望按bar='baz'
对所有行进行分组。
我有这样的查询:
SELECT foo, string_agg(bar)
FROM table
WHERE bar='baz'
GROUP BY foo;
但是,这显然会遗漏bar!=baz
行。
如果组中至少有一个匹配,我想要包含这些行。
实现这一目标的最佳方法是什么?
我考虑过使用array_agg(bar)和ANY进行子选择,例如:
SELECT foo, bars FROM (
SELECT foo, array_agg(bar) as bars
FROM table
WHERE 'baz' ANY(bars)
GROUP BY FOO
)
但这似乎是一个丑陋的解决方案,也不允许我使用string_agg。
答案 0 :(得分:1)
使用EXISTS
SELECT foo, string_agg(bar)
FROM table
WHERE EXIST (SELECT 1 FROM table t WHERE t.bar='baz' AND t.foo = foo)
GROUP BY foo;
或IN
也很有用
SELECT foo, string_agg(bar)
FROM table
WHERE foo IN (SELECT t.foo FROM table t WHERE t.bar='baz')
GROUP BY foo;
答案 1 :(得分:1)
针对@ Radim的exists
答案测试bool_or
:
select foo, string_agg(bar)
from t
group by foo
having bool_or(bar = 'baz')