SQLShack (Norsk)

Denne artikkelen utforsker SQL Count Distinct-operatøren for eliminering de dupliserte radene i resultatsettet.

En utvikler må hente data fra en SQL-tabell med flere betingelser. Noen ganger ønsker vi å få alle rader i en tabell, men eliminere de tilgjengelige NULL-verdiene. Anta at vi ønsker å få forskjellige kundeposter som har bestilt i fjor.

La oss gå videre og ha en rask oversikt over SQL Count-funksjonen.

SQL Count-funksjon

Vi bruker SQL Count-aggregasjonsfunksjon for å få antall rader i utgangen. Anta at vi har en produkttabell som holder rekord for alle produkter som selges av et selskap. Vi vil vite antall solgte produkter i løpet av siste kvartal. Vi kan bruke SQL Count-funksjonen til å returnere antall rader i den angitte tilstanden.

Syntaksen til SQL COUNT-funksjonen:
COUNT (uttrykk);

Som standard, SQL Server Count Function bruker alle søkeord. Det betyr at SQL Server teller alle poster i en tabell. Den inkluderer også radene som har dupliserte verdier.

La oss lage en eksempeltabell og sette inn noen poster i den.

I denne tabellen har vi også dupliserte verdier og NULL-verdier .

I følgende skjermbilde kan vi merke oss at:

  • Count (* ) inkluderer dupliserte verdier så vel som NULL-verdier
  • Antall (Col1) inkluderer dupliserte verdier, men inkluderer ikke NULL-verdier

Anta at vi vil vite de forskjellige verdiene som er tilgjengelige i tabellen. Vi kan bruke SQL COUNT DISTINCT til å gjøre det.

1
2

Velg antall (DISTINCT COL1)
fra ## Testtabell

I den følgende utgangen får vi bare to rader. SQL COUNT Distinct eliminerer ikke duplikat- og NULL-verdier fra resultatsettet.

La oss se på et annet eksempel. I dette eksemplet har vi en plasseringstabell som består av to kolonner By og stat.

Nå, utfør følgende spørring for å finne ut en telling av den forskjellige byen fra tabellen.

1
2

VELG TELL (DISTINCT (by))
FRA plassering;

Den returnerer antall unike bytall 2 (Gurgaon og Jaipur) fra resultatsettet.

Hvis vi ser på dataene, har vi lignende bynavn tilstede i et annet staten også. Kombinasjonen av by og stat er unik, og vi vil ikke at den unike kombinasjonen skal elimineres fra utdataene.

Vi kan også bruke SQL DISTINCT-funksjonen på en kombinasjon av kolonner. Den ser etter kombinasjonen av verdier og fjerner hvis kombinasjonen ikke er unik.

1
2

VELG DISTINCT By, stat
FRA sted;

Det fjerner ikke dupliserte bynavn fra utdata på grunn av en unik verdikombinasjon.

La oss sette inn en rad til i plasseringstabellen.

1

Sett inn plasseringsverdier («Gurgaon «,» Haryana «)

Vi har 5 poster i plasseringstabellen. I dataene kan du se at vi har en kombinasjon av by og stat som ikke er unik.

Kjør SELECT DISTINCT funksjon, og den skal bare returnere 4 rader denne gangen.

Vi kan ikke bruke SQL COUNT DISTINCT-funksjonen direkte med flere kolonner . Du får følgende feilmelding.

Vi kan bruke en midlertidig tabell for å få poster fra SQL DISTINCT-funksjonen og deretter bruke tell (*) for å sjekke radtallene.

1
2
3
4

VELG DISTINCT By, stat
i #Temp
FRA sted;
Velg antall (*) fra #Temp

Vi får radtellingen 4 i utdataene.

Hvis vi bruker en kombinasjon av kolonner for å bli tydelig verdier og hvilken som helst av kolonnene inneholder NULL-verdier, blir det også en unik kombinasjon for SQL Server.

For å bekrefte dette, la oss sette inn flere poster i plasseringstabellen. Vi spesifiserte ingen tilstand i dette spørringen.

1
2

Sett inn plasseringsverdier («Gurgaon», «»)
Sett inn sted (by) -verdier («Gurgaon»)

La oss se på dataene om plasseringstabellen.

Kjør spørringen på nytt for å bli tydelig rader fra plasseringstabellen.

1
2

VELG distinkt by, stat
FRA beliggenhet;

I utgangen kan vi se at det ikke eliminerer kombinasjonen av by og stat med de tomme eller NULL-verdiene.

På samme måte kan du se radtall 6 med SQL COUNT DISTINCT-funksjon.

Forskjell mellom SELECT COUNT, COUNT (*) og SQL COUNT distinkt

COUNT

Count (*)

Count (Distinct)

Den returnerer totalt antall rader etter tilfredsstillende betingelser som er angitt i hvor-setningen.

Den returnerer det totale antallet rader etter tilfredsstillende betingelser som er angitt i hvor-setningen.

Den returnerer det distinkte antall rader etter tilfredsstillende betingelser spesifisert i hvor-setningen .

Det gir antall rader. Det eliminerer ikke dupliserte verdier.

Den tar hensyn til alle rader uansett duplikat, NULL-verdier.

Det gir en tydelig antall rader etter eliminering av NULL og dupliserte verdier.

Det eliminerer NULL-verdiene i utdataene.

Det eliminerer ikke NULL-verdiene i utgangen.

Det eliminerer NULL-verdiene i utdataene.

Utførelsesplan for SQL Count-funksjonen

La oss se på den faktiske utførelsesplanen for SQL COUNT DISTINCT-funksjonen. Du må aktivere den faktiske utførelsesplanen fra SSMS-menylinjen som vist nedenfor.

Utfør spørringen for å få en faktisk gjennomføringsplan. I denne utførelsesplanen kan du se topp ressurskrevende operatører:

  • Sorter (distinkt sortering) – kostnad 78%
  • tabellskanning – kostnad 22%

Du kan sveve musen over sorteringsoperatoren, og den åpner et verktøytips med operatørdetaljene.

I egenskapsvinduene får vi også flere detaljer rundt sorteringsoperatøren inkludert minnetildeling, statistikk og antall rader.

I en tabell med millioner poster kan SQL Count Distinct forårsake ytelsesproblemer fordi en distinkt count-operator er en kostbar operatør i faktisk utførelsesplan.

SQL Server 2019 forbedrer ytelsen til SQL COUNT DISTINCT-operatøren ved hjelp av en ny funksjon Approx_count_distinct. Denne nye funksjonen til SQL Server 2019 gir en omtrentlig distinkt telling av radene. Det kan være en liten forskjell i funksjonen for SQL Count-distinkt og Approx_Count_distinct-funksjon.

Du kan erstatte SQL COUNT DISTINCT med nøkkelordet Approx_Count_distinct for å bruke denne funksjonen fra SQL Server 2019.

1
2

VELG APPROX_COUNT_DISTINCT (by)
FRA plassering;

Du kan utforske mer om denne funksjonen i Den nye SQL Server 2019-funksjonen Approx_Count_Distinct.

Konklusjon

I denne artikkelen utforsket vi SQL COUNT-funksjonen med forskjellige eksempler. Vi dekket også den nye SQL-funksjonen Approx_Count_distinct tilgjengelig fra SQL Server 2019. Jeg vil foreslå å gjennomgå dem i henhold til ditt miljø. Hvis du har kommentarer eller spørsmål, kan du legge dem igjen i kommentarene nedenfor.

  • Forfatter
  • Nylige innlegg
Som MCSA-sertifisert og Microsoft Certified Trainer i Gurgaon, India, med 13 års erfaring, jobber Rajendra for en rekke store selskaper med fokus på ytelsesoptimalisering, overvåking, høy tilgjengelighet , og katastrofegjenopprettingsstrategier og implementering. Han er forfatter av hundrevis av autoritative artikler om SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS / Amazon RDS, Git og relaterte teknologier som til nå har blitt sett av over 10m lesere.
Han er skaper av en av de største gratis online samlingene av artikler om et enkelt emne, med sin 50-delte serie om SQL Server Always On Availability Groups. Basert på sitt bidrag til SQL Server-fellesskapet, har han blitt anerkjent med forskjellige priser, inkludert den prestisjetunge «Årets beste forfatter» kontinuerlig i 2020 og 2021 på SQLShack.
Raj er alltid interessert i nye utfordringer, så hvis du trenger rådgivning hjelp til ethvert emne som dekkes av hans forfatterskap, kan du nås på [email protected]
Se alle innlegg av Rajendra Gupta

Siste innlegg av Rajendra Gupta (se alle)
  • Tidsavbrudd for økt i SQL Server Alltid på tilgjengelighet Grupper – 8. februar 2021
  • Utføre mindre og større versjonsoppgraderinger for AWS RDS SQL Server – 29. januar 2021
  • Distribuere AWS RDS PostgreSQL-forekomster – 27. januar 2021

Write a Comment

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