Denne artikel udforsker SQL Count Distinct-operator til eliminering de duplikerede rækker i resultatsættet.
En udvikler skal hente data fra en SQL-tabel med flere betingelser. Nogle gange ønsker vi at få alle rækker i en tabel, men fjerne de tilgængelige NULL-værdier. Antag, at vi ønsker at få forskellige kundeposter, der har afgivet en ordre sidste år.
Lad os gå videre og få et hurtigt overblik over SQL Count-funktion.
SQL Count-funktion
Vi bruger SQL Count-aggregatfunktion til at få antallet af rækker i output. Antag, at vi har en produkttabel, der holder poster for alle produkter, der sælges af en virksomhed. Vi vil vide antallet af solgte produkter i sidste kvartal. Vi kan bruge SQL Count-funktionen til at returnere antallet af rækker i den angivne tilstand.
Syntaksen for SQL COUNT-funktionen:
COUNT (udtryk);
Som standard, SQL Server Count-funktion bruger alle nøgleord. Det betyder, at SQL Server tæller alle poster i en tabel. Det inkluderer også rækkerne, der også har duplikatværdier.
Lad os oprette en eksempeltabel og indsætte få poster i den.
I denne tabel har vi også duplikatværdier og NULL-værdier .
I det følgende skærmbillede kan vi bemærke, at:
- Count (* ) inkluderer dobbeltværdier såvel som NULL-værdier
- Count (Col1) inkluderer duplikatværdier, men inkluderer ikke NULL-værdier
Antag, at vi vil vide de forskellige værdier, der er tilgængelige i tabellen. Vi kan bruge SQL COUNT DISTINCT til at gøre det.
1
2
|
Vælg antal (DISTINCT COL1)
fra ## Testtabel
|
I den følgende output får vi kun 2 rækker. SQL COUNT Distinct fjerner ikke duplikat- og NULL-værdier fra resultatsættet.
Lad os se på et andet eksempel. I dette eksempel har vi en placeringstabel, der består af to kolonner By og stat.
Udfør nu følgende forespørgsel for at finde ud af en optælling af den forskellige by fra tabellen.
1
2
|
VÆLG TÆLL (DISTINCT (by))
FRA placering;
|
Det returnerer antallet af unikke bytælling 2 (Gurgaon og Jaipur) fra vores resultatsæt.
Hvis vi ser på dataene, har vi et lignende bynavn til stede i et andet stat også. Kombinationen af by og stat er unik, og vi ønsker ikke, at den unikke kombination elimineres fra output.
Vi kan også bruge SQL DISTINCT-funktionen på en kombination af kolonner. Det kontrollerer kombinationen af værdier og fjerner, hvis kombinationen ikke er unik.
1
2
|
VÆLG DISTINCT By, stat
FRA placering;
|
Det fjerner ikke de dobbelte bynavne fra output på grund af en unik værdikombination.
Lad os indsætte endnu en række i placeringstabellen.
1
|
Indsæt i placeringsværdier (“Gurgaon “,” Haryana “)
|
Vi har 5 poster i placeringstabellen. I dataene kan du se, at vi har en kombination af by og tilstand, der ikke er unik.
Kør SELECT DISTINCT igen funktion, og den skal kun returnere 4 rækker denne gang.
Vi kan ikke bruge SQL COUNT DISTINCT-funktionen direkte med de flere kolonner . Du får følgende fejlmeddelelse.
Vi kan bruge en midlertidig tabel til at hente poster fra SQL DISTINCT-funktionen og derefter bruge tælle (*) for at kontrollere rækkeoptællingerne.
1
2
3
4
|
VÆLG DISTINCT By, stat
i #Temp
FRA placering;
Vælg antal (*) fra #Temp
|
Vi får rækkeantal 4 i output.
Hvis vi bruger en kombination af kolonner for at få tydelig værdier og en hvilken som helst af kolonnerne indeholder NULL-værdier, det bliver også en unik kombination for SQL Server.
For at bekræfte dette, lad os indsætte flere poster i placeringstabellen. Vi specificerede ingen tilstand i denne forespørgsel.
1
2
|
Indsæt i placeringsværdier (“Gurgaon”, “”)
Indsæt i placeringsværdier (“Gurgaon”)
|
Lad os se på data om placeringstabellen.
Kør forespørgslen igen for at blive tydelig rækker fra placeringstabellen.
1
2
|
VÆLG særskilt by, stat
FRA placering;
|
I output kan vi se, at det ikke eliminerer kombinationen af by og stat med de tomme eller NULL-værdier.
På samme måde kan du se rækkeantal 6 med SQL COUNT DISTINCT-funktion.
Forskel mellem SELECT COUNT, COUNT (*) og SQL COUNT differentieret
COUNT |
Count (*) |
Count (Distinct) |
Det returnerer det samlede antal rækker efter opfyldelse af de betingelser, der er angivet i hvor-klausulen. |
Det returnerer det samlede antal rækker efter opfyldelse af betingelserne specificeret i hvor-klausulen. |
Det returnerer det bestemte antal rækker efter opfyldelse af betingelser, der er specificeret i hvor-klausulen . |
Det giver antallet af rækker. Det fjerner ikke duplikatværdier. |
Det betragter alle rækker uanset duplikat, NULL-værdier. |
Det giver en tydeligt antal rækker efter eliminering af NULL og duplikerede værdier. |
Det eliminerer NULL-værdierne i output. |
Det fjerner ikke NULL-værdierne i output. |
Det fjerner NULL-værdierne i output. |
Udførelsesplan for SQL Count-særskilt funktion
Lad os se på den faktiske udførelsesplan for SQL COUNT DISTINCT-funktionen. Du skal aktivere den faktiske udførelsesplan fra SSMS-menulinjen som vist nedenfor.
Udfør forespørgslen for at få en faktisk udførelsesplan. I denne udførelsesplan kan du se de mest ressourcekrævende operatører:
- Sort (Distinct Sort) – Cost 78%
- Table Scan – Cost 22%
Du kan holde musen over sorteringsoperatoren, og den åbner et værktøjstip med operatøroplysningerne.
I egenskabsvinduerne får vi også flere detaljer omkring sorteringsoperatoren inklusive hukommelsesallokering, statistik og antallet af rækker.
I en tabel med millioner poster kan SQL Count Distinct forårsage ydeevneproblemer, fordi en særskilt count-operator er en dyr operatør i faktisk udførelsesplan.
SQL Server 2019 forbedrer ydeevnen for SQL COUNT DISTINCT-operatøren ved hjælp af en ny Approx_count_distinct-funktion. Denne nye funktion af SQL Server 2019 giver et omtrentligt særskilt antal rækkerne. Der kan være en lille forskel i SQL Count-udskillelse og Approx_Count_distinct-funktion output.
Du kan erstatte SQL COUNT DISTINCT med nøgleordet App_Count_distinct for at bruge denne funktion fra SQL Server 2019.
1
2
|
VÆLG APPROX_COUNT_DISTINCT (by)
FRA placering;
|
Du kan udforske mere om denne funktion i Den nye SQL Server 2019-funktion Approx_Count_Distinct.
Konklusion
I denne artikel undersøgte vi SQL COUNT-funktionen med forskellige eksempler. Vi dækkede også den nye SQL-funktion Approx_Count_distinct tilgængelig fra SQL Server 2019. Jeg vil foreslå at gennemgå dem i henhold til dit miljø. Hvis du har kommentarer eller spørgsmål, er du velkommen til at efterlade dem i kommentarerne nedenfor.
- Forfatter
- Seneste indlæg
Han er skaberen af en af de største gratis online samlinger af artikler om et enkelt emne med sin 50-dels serie om SQL Server Always On Availability Groups. Baseret på hans bidrag til SQL Server-samfundet er han blevet anerkendt med forskellige priser, herunder den prestigefyldte “Årets bedste forfatter” kontinuerligt i 2020 og 2021 hos SQLShack.
Raj er altid interesseret i nye udfordringer, så hvis du har brug for rådgivning hjælp til ethvert emne, der er dækket af hans skrifter, han kan nås på [email protected]
Se alle indlæg af Rajendra Gupta
- Sessionstimeouts i SQL Server Always On Availability Grupper – 8. februar 2021
- Udførelse af mindre og større versionopgraderinger til AWS RDS SQL Server – 29. januar 2021
- Implementering af AWS RDS PostgreSQL-forekomster – 27. januar 2021