2016-07-07 33 views
1

der folgenden Tabelle angegeben erfüllen:Wählen Sie Zeilen, die eine bestimmte Gruppe Bedingung in psql

id | value 
    ---+--------- 
    1 | 1 
    1 | 0 
    1 | 3 
    2 | 1 
    2 | 3 
    2 | 5 
    3 | 2 
    3 | 1 
    3 | 0 
    3 | 1 

Ich möchte die folgende Tabelle:

id | value 
    ---+--------- 
    1 | 1 
    1 | 0 
    1 | 3 
    3 | 2 
    3 | 1 
    3 | 0 
    3 | 1 

Die Tabelle enthält ids, die ein Minimum value von 0 haben. Ich habe versucht mit exist und having, aber ohne Erfolg.

Antwort

0

Wenn ich richtig zu verstehen, ist es eine ziemlich einfache having Klausel:

=# 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) 

Habe ich etwas übersehen, dass es komplizierter macht?

+0

Ich möchte eigentlich alle Einträge mit ID = 1 und ID = 3. – labrynth

1

versuchen Sie dies:

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

oder dass (mit Fensterfunktionen)

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

vielen Dank Rémy! – labrynth

0

Es sieht es nicht möglich ist, Fensterfunktion in verwenden WHERE oder HAVING. Unten ist eine Lösung basierend auf JOINs.

  1. JOIN jede Zeile mit allen Zeilen der gleichen ID.
  2. Filter basierend auf dem zweiten Satz.
  3. Ergebnis vom ersten Satz anzeigen.

Die SQL sieht so aus.

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

Sie müssen ein distinct hinzufügen, denn wenn Sie mehr als einen Wert 0 für eine ID haben, wird das Ergebnis dupliziert. –

+0

Wenn es mehr als eine 0 für eine ID gibt, gibt es doppelte Zeilen in der Quelltabelle. Es ist ein anderes Problem. – Michas

+0

ja, aber es gibt doppelte Zeilen im Beispiel (id 3 Wert 1), es ist nicht sehr schön, aber nicht verbieten.Vielleicht gibt es eine andere echte eindeutige ID, ich weiß es nicht und es ist nicht wichtig, so effektiv ein Unterschied wird nicht korrigieren, weil Wir müssen doppelte Zeilen behalten, aber Ihre Anfrage verdoppelt das Ergebnis. Beispiel: Wenn Sie Werte (4,0), (4,0), (4,1) hinzufügen, gibt Ihre Anfrage 6 Zeilen mit id = 4 zurück -> es ist nicht wahr –

Verwandte Themen