2009-08-25 10 views
42

Distinct Wertepaar SQL

create table pairs (number a, number b) 

betrachten, wo die Daten

1,1 
1,1 
1,1 
2,4 
2,4 
3,2 
3,2 
5,1 

Etc.

Was Abfrage gibt mir die unterschiedlichen Werte die Zahl Spalte b hat So kann ich sehen

1,1 
5,1 
2,4 
3,2 

nur

Ich habe versucht

select distinct (a) , b from pairs group by b 

aber gibt mir "nicht eine Gruppe durch den Ausdruck"

Antwort

56

Was Sie meinen, ist entweder

SELECT DISTINCT a, b FROM pairs; 

oder

SELECT a, b FROM pairs GROUP BY a, b; 
+3

Nun, da ich darüber nachdenke, ist die Gruppierung nach jeder Spalte die gleiche wie die Gruppierung nach keiner. Und du hast mich um 30 Sekunden geschlagen. +1 – JamesMLV

+6

JamesMLV, Gruppierung nach jeder Spalte ist nicht das gleiche wie Gruppierung durch keine, wenn Sie doppelte Zeilen haben. Betrachten Sie die Ausgabe von SELECT a, b, count (*) FROM pairs. –

+0

Oscar jetzt erkannte ich, dass meine Abfrage gibt Ihnen zusätzliche Spalte für b = 1 (ich habe es tatsächlich falsch gelesen, zu wissen, dass Sie beide Spalten wollen, nahm ich an, Sie wollen verschiedene Zeilen) ... –

9

Diese gibt Ihnen das Ergebnis, das Sie als e geben xample:

SELECT DISTINCT a, b 
FROM pairs 
4

wenn Sie möchten, die Tupel filtern, die Sie auf diese Weise verwenden können:

select distinct (case a > b then (a,b) else (b,a) end) from pairs 

die guten Sachen ist, Sie müssen nicht Gruppe verwenden, indem.

+0

Ich war sehr auf diese Methode hoffnungsvoll, aber immer wieder auf einen "ORA-00907: fehlende Klammer" -Fehler. Wie lauten die Syntaxregeln zum Sortieren der Spalten nach dieser Methode? – Chris

0

Wenn Sie nur eine Anzahl der verschiedenen Paare wollen.

Der einfachste Weg, dies zu tun ist, wie SELECT COUNT(DISTINCT a,b) FROM pairs

Die bisherigen Lösungen folgt die Paare alle würden Liste und dann würden Sie haben eine zweite Abfrage zu tun, um sie zu zählen.

9

Wenn Sie wollen, wollen 1,2 und 2,1 als das gleiche Paar zu behandeln, dann wird dieser Ihnen die einzigartige Liste auf MS-SQL:

SELECT DISTINCT 
    CASE WHEN a > b THEN a ELSE b END as a, 
    CASE WHEN a > b THEN b ELSE a END as b 
FROM pairs 

von @meszias Inspired beantworten oben

+0

natürlich! Wie auch immer, bevor ich diese Antwort gelesen habe, war ich ratlos. Danke. – Greg