是否有类似group by的东西,它还允许我查询每个组中的单个行?

时间:2019-08-01 07:35:41

标签: postgresql

我使用PostgreSQL 11.4,并且想解决以下问题:

让我说一下下表:

foo | bar
---------
a     null
a     2
a     8
a     3
b     2
c     null
c     8
c     5
c     2

我想获取foo中的所有字段,其中bar作为至少一个null和一个none-null值。

所以预期的结果将是ac,因为这些是唯一具有至少一个null和一个非null值的键

请注意,我这里没有唯一的主键,因此我不能真正基于foo对表进行几次连接并检查每个连接或其他内容。

有人知道如何解决此问题吗?

任何信息将不胜感激。

3 个答案:

答案 0 :(得分:1)

一种解决方案是使用两个EXISTS条件:

select distinct foo
from the_table t1
where exists (select * 
              from the_table t2
              where t2.bar is null
                and t2.foo = t1.foo)
  and exists (select * 
              from the_table t3
              where t3.bar is not null
                and t3.foo = t1.foo)

另一种选择是按foo分组并计算行数:

select foo
from the_table
group by foo
having count(*) filter (where bar is null) > 0
   and count(*) filter (where bar is not null) > 0;

第一个可能会更快

答案 1 :(得分:0)

您可以使用with子句,选择所有具有空值的foo,然后选择所有具有非空值的foo ...

with temp_null as 
(
    select distinct on (foo)
    *
    from public.tbl_test2
    where bar is null
),
temp_notnull as
(
    select distinct on (foo)
    *
    from public.tbl_test2
    where bar is not null 
)

select distinct on (foo)
foo
 from public.tbl_test2
where foo in (select foo from temp_null)
and foo in (select foo from temp_notnull)

答案 2 :(得分:0)

没有主键不应影响您的加入能力。以下内容似乎可以满足您的要求:

create table foobar (foo  VARCHAR (50),bar int);
insert into foobar (foo,bar) 
values('a',null),
('a',2),
('a',8),
('a',3),
('b',2),
('c',null),
('c',8),
('c',5),
('c',2);

select a.foo from foobar a
JOIN foobar b
on b.foo = a.foo
where a.bar is null 
and b.bar is not null
group by a.foo;

http://sqlfiddle.com/#!9/be97f3/14