Postgres:GROUP BY后的匹配模式

时间:2017-09-14 06:48:35

标签: sql postgresql

如果组中至少有一行与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。

2 个答案:

答案 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')