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中使用窗口函数。下面是基于联接的解决方案
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;