PostgreSQL:如何选择具有一个特定专业的集群?

时间:2015-12-02 21:28:24

标签: postgresql aggregate

假设我有一个包含2列的表:

Col1 Col2
 a    x
 a    y
 a    z
 b    x
 c    y

我想选择在col2中具有特定值的col1值(例如"仅' x'","仅' y&#39 ;"或"仅' x'和' y'")。

例如,如果我想选择没有col2值' z'的col1值,结果应为:

Col1
 b
 c

2 个答案:

答案 0 :(得分:1)

使用漂亮的@a_horse_with_no_name provided sample和方便的bool_* aggregate functionsCode Wall

不是z

select c1
from t
group by c1
having not bool_or(c2 = 'z')
;
 c1 
----
 c
 b
 e
 d

x

select c1
from t
group by c1
having bool_and(c2 = 'x')
;
 c1 
----
 b
 d

必须有xy,而不是其他

select c1
from t
group by c1
having bool_or(c2 = 'x') and bool_or(c2 = 'y') and bool_and (c2 in ('x','y'))
;
 c1 
----
 e

至少xy

select c1
from t
group by c1
having bool_or(c2 = 'x') and bool_or(c2 = 'y')
;
 c1 
----
 a
 e

答案 1 :(得分:0)

  

我想选择没有col2值的col1值' z'

select distinct t1.col1
from the_table t1
where not exists (select *
                  from the_table t2
                  where t1.col1 = t2.col1 
                    and t2.col2 = 'z');
  

,例如"只有' x'"

然而,

有点不同:

select col1
from the_table
group by col1
having count(distinct col2) = 1
  and min(col2) = 'x'
  and max(col2) = 'x'

"只有x"也可以使用Postgres布尔聚合函数来完成:

select col1
from the_table
group by col1
having bool_and(col2 = 'x');
  

"只有' x'和''

这可以读作" *至少x和y" (但也允许其他值)。然后这将是:

select col1
from the_table t1
group by col1
having array_agg(col2 order by col2) @> array['x','y'];

使用标准SQL,上面的内容将是这样的:

select col1
from the_table
where col2 in ('x','y')
group by col1
having count(distinct col2) = 2;

如果" 仅' x'和' "意味着完全那两个,然后可以使用=比较数组而不是使用" contains"操作

select col1
from the_table t1
group by col1
having array_agg(col2 order by col2) = array['x','y'];

order by的{​​{1}}非常重要,因为array_agg()是一个不同的数组,然后{'y','x'}

这也可以使用布尔聚合来表示:

{'x','y'}

使用标准SQL这个"正是那两个"变得有点复杂:

select col1
from the_table
group by col1
having bool_and(col2 in ('x','y'))
   and count(distinct col2) = 2;

在线示例:http://rextester.com/BQZX64681