2009-08-25 13 views
42

RozważmyWyraźny para wartości SQL

create table pairs (number a, number b) 

gdzie dane są

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

Itd

Co kwerendy daje mi różne wartości w kolumnie liczba b ma tak widzę

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

tylko

Próbowałem

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

ale daje mi "a nie przez grupę wyrażenia"

Odpowiedz

56

Co masz na myśli to albo

SELECT DISTINCT a, b FROM pairs; 

lub

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

Teraz, gdy o tym myślę, grupowanie według każdej kolumny jest takie samo, jak bez grupowania. I pokonałeś mnie 30 sekund. +1 – JamesMLV

+6

JamesMLV, grupowanie według każdej kolumny nie jest tym samym, co brak grupowania przez żadne, jeśli masz zduplikowane wiersze. Rozważ wynik polecenia "SELECT a, b, count (*) FROM pairs". –

+0

Oscar teraz zdałem sobie sprawę, że moje zapytanie da ci dodatkową kolumnę dla b = 1 (faktycznie błędnie przeczytałem to, wiedząc, że chcesz mieć obie kolumny, zakładałem, że chcesz odrębne wiersze) ... –

9

ten da ci wynik, który dajesz jako e XAMPLE:

SELECT DISTINCT a, b 
FROM pairs 
4

jeśli chcesz filtrować krotki można użyć na tej drodze:

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

dobre rzeczy jest to, nie trzeba używać przez grupę.

+0

Byłem pełen nadziei z tą metodą, ale wciąż napotykam błąd "ORA-00907: brak prawych nawiasów". Jakie są reguły składni przy sortowaniu kolumn według tej metody? – Chris

0

Jeśli chcesz tylko zliczać oddzielne pary.

Najprostszym sposobem na to jest następująca SELECT COUNT(DISTINCT a,b) FROM pairs

Dotychczasowe rozwiązania byłoby wymienić wszystkie pary i wtedy trzeba by zrobić drugą kwerendę je policzyć.

9

Jeśli chcesz chcą leczyć 1,2 i 2,1 w tej samej pary, to daje unikalną listę na 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 

Zainspirowany @meszias odpowiedzieć powyżej

+0

oczywiście! jednak byłem zaskoczony, jak to zrobić, zanim przeczytam tę odpowiedź. dzięki. – Greg