2016-07-07 96 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 –