2016-07-07 97 views
1

一组特定的条件如下表中选择行:满足在PSQL

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 

表包含ids有最小值0 value。 我尝试过使用existhaving,但没有成功。

回答

0

如果我理解正确的话,这是一个相当简单的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) 

我错过了什么是使它更复杂?

+0

我实际上想要所有的条目id = 1和id = 3。 – labrynth

1

试试这个:

select * from foo where id in (SELECT id FROM foo GROUP BY id HAVING MIN(value) = 0) 

,或者(有窗功能)

select * from 
(select *,min(value) over (PARTITION BY id) min_by_id from foo) a 
where min_by_id=0 
+0

非常感谢Rémy! – labrynth

0

它看起来是不可能使用窗函数在WHERE或HAVING。以下是基于JOIN的解决方案。

  1. 将每行都加入相同ID的所有行。
  2. 基于第二组筛选。
  3. 显示第一组结果。

SQL看起来像这样。

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

你必须添加一个独特的,因为如果你有多个值为0的一个id,结果将被复制 –

+0

如果一个id有多个0,那么在源表中有重复的行。这是一个不同的问题。 – Michas

+0

是的,但在例证中有重复的行(id 3值1),它不是很漂亮,但并不禁止。也许还有另外一个真正的唯一id,我不知道,也不重要,所以有效地区分不会是正确的,因为我们必须保留重复的行,但您的请求会重复更多结果。如果添加值(4,0),(4,0),(4,1),则您的请求将返回id = 4的6行 - >它不是true –