Postgresql 在psql中选择满足特定组条件的行

Postgresql 在psql中选择满足特定组条件的行,postgresql,group-by,Postgresql,Group By,鉴于下表: id | value ---+--------- 1 | 1 1 | 0 1 | 3 2 | 1 2 | 3 2 | 5 3 | 2 3 | 1 3 | 0 3 | 1 我想要下表: id | value ---+--------- 1 | 1 1 | 0 1 | 3 3 | 2

鉴于下表:

 id  |  value 
  ---+---------
  1  |    1 
  1  |    0
  1  |    3
  2  |    1
  2  |    3
  2  |    5
  3  |    2 
  3  |    1
  3  |    0
  3  |    1
我想要下表:

 id  |  value 
  ---+---------
  1  |    1 
  1  |    0
  1  |    3
  3  |    2 
  3  |    1
  3  |    0
  3  |    1
该表包含最小值为0的
ID

我尝试过使用
exist
have
但没有成功。

如果我理解正确,这是一个相当简单的
having
子句:

=# SELECT id, MIN(value), MAX(value) FROM foo GROUP BY id HAVING MIN(value) = 0;
 id | min | max 
----+-----+-----
  1 |   0 |   3
  3 |   0 |   2
(2 rows)
我错过了使事情变得更复杂的东西吗?

试试这个:

select * from foo where id in (SELECT id FROM foo GROUP BY id HAVING MIN(value) = 0) 
或(具有窗口功能)


看起来不可能在WHERE或have中使用窗口函数。下面是基于联接的解决方案

  • 用相同id的所有行连接每一行
  • 基于第二组的过滤器
  • 显示第一组的结果
  • SQL语句如下所示

    SELECT a.*
    FROM a_table AS a
    INNER JOIN a_table AS value ON a.id = b.id
    WHERE b.value = 0;
    

    实际上,我需要id=1和id=3的所有条目。您必须添加一个distinct,因为如果一个id有多个值0,则结果将重复。如果一个id有多个0,则源表中有重复的行。这是一个不同的问题。是的,但示例中有重复的行(id 3值1),这不是很漂亮,但也不是禁止的。可能还有另一个真正的唯一id,我不知道,这并不重要,因此有效地使用distinct将不正确,因为我们必须保留重复的行,但您的请求会复制更多的结果。例如,如果您添加值(4,0)、(4,0)、(4,1),您的请求将返回6行id=4->这不是真的
    SELECT a.*
    FROM a_table AS a
    INNER JOIN a_table AS value ON a.id = b.id
    WHERE b.value = 0;