I SQL, hur räknar jag DISTINCT över flera kolumner?


Bästa svaret

i SQL kan DISTINCT-satsen användas *** innan *** valt listan, för att undvika dubbla rader i utdata eller *** inuti *** en aggregeringsfunktion, till exempel COUNT. I det andra fallet, särskilt för COUNT, är effekten att man bara överväger att upprepa värden en gång. En lösning är att med den sammanfogning som föreslagits av Greg Kemnitz, förutom ett litet misstag och anpassningar beroende på kolumntyper och strängfunktioner i de olika SQL-motorerna

VÄLJ RÄKNING (DISTINCT CONCAT (col1, …. , col3)) FROM-tabell;

Den enkla lösningen

VÄLJ RÄKNING (DISTINCT col1, col2, col3) FROM-tabell;

fungerar med MySQL, fungerar inte fungerar i DB2 och jag vet inte om andra motorer, men det är inte standard SQL.

En annan, mer komplicerad lösning, som kan vara effektivare om operationen är frekvent och adekvat optimerad, kräver att man skapar en vy

CREATE VIEW vW AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VÄLJ RÄKN (*) FRÅN vw;

Svar

mysql> skapa tabell falsk (foo tinyint (3) inte null standard 0, bar varchar (64) inte null standard ””) ; Fråga OK, 0 rader påverkade (0,07 sek)

mysql> infoga i falska värden (1, ”foo”), (1, ”bar”), (2, ”foo”), (2, ”bar”), (3, ”baz”), (3, ”for”); Fråga OK, 6 rader påverkade (0,00 sek) Records: 6 duplikat: 0 Varningar: 0

mysql> välj foo, bar, count (*) från falsk grupp för foo, bar; + —– + —– + ———- + | foo | bar | räkna (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | för | 1 | + —– + —– + ———- + 6 rader i uppsättning (0,00 sek)

mysql> infoga i falska värden (1, ”foo ”), (1,” bar ”), (2,” foo ”), (2,” bar ”), (3,” baz ”), (3,” for ”); Fråga OK, 6 rader påverkade (0,00 sek) Records: 6 duplikat: 0 Varningar: 0

mysql> välj foo, bar, count (*) från falsk grupp för foo, bar; + —– + —– + ———- + | foo | bar | räkna (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | för | 2 | + —– + —– + ———- + 6 rader i uppsättning (0,00 sek)

mysql>

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *