I SQL, hvordan teller jeg DISTINCT over flere kolonner?


Beste svaret

i SQL kan DISTINCT-leddet brukes *** før *** listen er valgt, for å unngå dupliserte rader i utdata eller *** inne i *** en aggregeringsfunksjon, for eksempel COUNT. I det andre tilfellet, spesielt for COUNT, er effekten å vurdere å gjenta verdier bare en gang. En løsning er at med sammenkoblingen foreslått av Greg Kemnitz, bortsett fra en liten feil og tilpasninger avhengig av kolonnetyper og strengfunksjoner i de forskjellige SQL-motorene

VELG TELL (DISTINCT CONCAT (col1, …. , col3)) FRA tabell;

Den enkle løsningen

VELG TELL (DISTINCT col1, col2, col3) FRA tabell;

fungerer med MySQL, gjør ikke fungerer i DB2, og jeg vet ikke om andre motorer, men det er ikke standard SQL.

En annen, mer komplisert løsning, som kan være mer effektiv hvis operasjonen er hyppig og tilstrekkelig optimalisert, krever oppretting av en visning

OPPRETT VISNING vw SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VELG TELL (*) FRA vw;

Svar

mysql> lag tabell falske (foo tinyint (3) ikke null standard 0, bar varchar (64) ikke null standard «») ; Spørsmål OK, 0 rader påvirket (0,07 sek)

mysql> sett inn falske verdier (1, «foo»), (1, «bar»), (2, «foo»), (2, «bar»), (3, «baz»), (3, «for»); Spørring OK, 6 rader påvirket (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0

mysql> velg foo, bar, count (*) fra falsk gruppe for foo, bar; + —– + —– + ———- + | foo | bar | telle (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | for | 1 | + —– + —– + ———- + 6 rader i sett (0,00 sek)

mysql> sett inn falske verdier (1, «foo «), (1,» bar «), (2,» foo «), (2,» bar «), (3,» baz «), (3,» for «); Spørring OK, 6 rader påvirket (0,00 sek) Records: 6 duplikater: 0 Advarsler: 0

mysql> velg foo, bar, count (*) fra falsk gruppe for foo, bar; + —– + —– + ———- + | foo | bar | telle (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | for | 2 | + —– + —– + ———- + 6 rader i sett (0,00 sek)

mysql>

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *