SQLShack (Svenska)

Den här artikeln utforskar SQL Count Distinct-operatören för att eliminera de dubbla raderna i resultatuppsättningen.

En utvecklare behöver hämta data från en SQL-tabell med flera villkor. Ibland vill vi få alla rader i en tabell men eliminera tillgängliga NULL-värden. Antag att vi vill få distinkta kundposter som har gjort en order förra året.

Låt oss fortsätta och ha en snabb översikt över SQL Count-funktionen.

SQL Count-funktion

Vi använder SQL Count-aggregeringsfunktionen för att få antalet rader i produktionen. Anta att vi har en produkttabell som håller rekord för alla produkter som säljs av ett företag. Vi vill veta antalet sålda produkter under det senaste kvartalet. Vi kan använda SQL Count-funktionen för att returnera antalet rader i det angivna tillståndet.

Syntaxen för SQL COUNT-funktionen:
COUNT (uttryck);

Som standard, SQL Server Count-funktionen använder alla nyckelord. Det betyder att SQL Server räknar alla poster i en tabell. Det inkluderar också rader som har dubbla värden också.

Låt oss skapa en provtabell och infoga några poster i den.

I den här tabellen har vi också dubbla värden och NULL-värden .

I följande skärmdump kan vi notera att:

  • Antal (* ) innehåller dubbla värden såväl som NULL-värden
  • Antal (Col1) innehåller dubbla värden men inkluderar inte NULL-värden

Antag att vi vill veta vilka distinkta värden som finns i tabellen. Vi kan använda SQL COUNT DISTINCT för att göra det.

1
2

Välj antal (DISTINCT COL1)
från ## Testtabell

I följande utdata får vi bara två rader. SQL COUNT Distinct eliminerar inte dubbletter och NULL-värden från resultatuppsättningen.

Låt oss titta på ett annat exempel. I det här exemplet har vi en platstabell som består av två kolumner Stad och stat.

Utför nu följande fråga för att ta reda på ett antal av den distinkta staden från tabellen.

1
2

VÄLJ RÄKN (DISTINCT (stad))
FRÅN plats;

Det returnerar antalet unika stadsantal 2 (Gurgaon och Jaipur) från vår resultatuppsättning.

Om vi tittar på data har vi liknande stadsnamn i en annan staten också. Kombinationen av stad och stat är unik, och vi vill inte att den unika kombinationen ska elimineras från utdata.

Vi kan också använda SQL DISTINCT-funktionen i en kombination av kolumner. Den söker efter kombinationen av värden och tar bort om kombinationen inte är unik.

1
2

VÄLJ DISTINCT Stad, stat
FRÅN plats;

Det tar inte bort de dubbla stadsnamnen från utdata på grund av en unik kombination av värden.

Låt oss infoga ytterligare en rad i platstabellen.

1

Infoga i platsvärden (”Gurgaon ”,” Haryana ”)

Vi har 5 poster i plats tabellen. I data kan du se att vi har en kombination av stad och stat som inte är unik.

Kör om VÄLJ DISTINKT funktion, och den ska bara returnera fyra rader den här gången.

Vi kan inte använda SQL COUNT DISTINCT-funktionen direkt med flera kolumner . Du får följande felmeddelande.

Vi kan använda en tillfällig tabell för att hämta poster från SQL DISTINCT-funktionen och sedan använda räkna (*) för att kontrollera antalet rader.

1
2
3
4

VÄLJ DISTINCT Stad, stat
i #Temp
FRÅN plats;
Välj antal (*) från #Temp

Vi får radantalet 4 i utdata.

Om vi använder en kombination av kolumner för att bli tydliga värden och någon av kolumnerna innehåller NULL-värden, det blir också en unik kombination för SQL Server.

För att verifiera detta, låt oss infoga fler poster i platstabellen. Vi angav inget tillstånd i denna fråga.

1
2

Infoga i platsvärden (”Gurgaon”, ””)
Infoga i platsvärden (”Gurgaon”)

Låt oss titta på platstabellens data.

Kör frågan igen för att bli tydlig rader från platstabellen.

1
2

VÄLJ distinkt stad, stat
FRÅN plats;

I utgången kan vi se att det inte eliminerar kombinationen av stad och stat med de tomma eller NULL-värdena.

På samma sätt kan du se radantal 6 med SQL COUNT DISTINCT-funktion.

Skillnad mellan SELECT COUNT, COUNT (*) och SQL COUNT distinkt

COUNT

Count (*)

Räkna (distinkt)

Det returnerar det totala antalet rader efter att uppfylla villkoren som anges i var-klausulen.

Det returnerar det totala antalet rader efter att ha uppfyllt villkoren som anges i där-klausulen.

Det returnerar det distinkta antalet rader efter att ha uppfyllt villkoren som anges i där-klausulen .

Det ger antalet rader. Det eliminerar inte dubbla värden.

Det tar hänsyn till alla rader oavsett dubbletter, NULL-värden.

Det ger en tydligt antal rader efter eliminering av NULL- och dubblettvärden.

Det eliminerar NULL-värdena i utdata.

Det eliminerar inte NULL-värdena i utdata.

Det eliminerar NULL-värdena i utdata.

Exekveringsplan för SQL Räkna särskild funktion

Låt oss titta på planen för verklig utförande av SQL COUNT DISTINCT-funktionen. Du måste aktivera den faktiska genomförandeplanen från SSMS-menyraden som visas nedan.

Utför frågan för att få en faktisk genomförandeplan. I den här exekveringsplanen kan du se de bästa resurskrävande operatörerna:

  • Sortera (distinkt sortering) – kostnad 78%
  • Tabellsökning – kostnad 22%

Du kan hålla musen över sorteringsoperatören och den öppnar ett verktygstips med operatörsinformation.

I egenskapsfönstren får vi också mer information kring sorteringsoperatören inklusive minnestilldelning, statistik och antalet rader.

I en tabell med miljoner poster kan SQL Count Distinct orsaka prestandaproblem eftersom en distinkt räkneoperatör är en kostsam operatör i faktisk körningsplan.

SQL Server 2019 förbättrar prestandan för SQL COUNT DISTINCT-operatören med en ny Approx_count_distinct-funktion. Den här nya funktionen i SQL Server 2019 ger ett ungefärligt antal rader. Det kan finnas en liten skillnad i SQL-utdata distinkta och Approx_Count_distinct funktionsutdata.

Du kan ersätta SQL COUNT DISTINCT med nyckelordet App_Count_distinct för att använda den här funktionen från SQL Server 2019.

1
2

VÄLJ APPROX_COUNT_DISTINCT (stad)
FRÅN plats;

Du kan utforska mer om den här funktionen i den nya SQL Server 2019-funktionen App_Count_Distinct.

Slutsats

I den här artikeln undersökte vi SQL COUNT-funktionen med olika exempel. Vi täckte också den nya SQL-funktionen Approx_Count_distinct tillgänglig från SQL Server 2019. Jag föreslår att du granskar dem enligt din miljö. Om du har några kommentarer eller frågor, lämna dem gärna i kommentarerna nedan.

  • Författare
  • Senaste inlägg
Som MCSA-certifierad och Microsoft Certified Trainer i Gurgaon, Indien, med 13 års erfarenhet, arbetar Rajendra för en mängd stora företag med fokus på prestandaoptimering, övervakning, hög tillgänglighet , och katastrofåterställningsstrategier och implementering. Han är författare till hundratals auktoritativa artiklar om SQL Server, Azure, MySQL, Linux, Power BI, Performance Tuning, AWS / Amazon RDS, Git och relaterade teknologier som hittills har visats av över 10 miljoner läsare.
Han är skaparen av en av de största gratis onlinesamlingarna av artiklar om ett enda ämne, med sin 50-delarserie om SQL Server Always On Availability Groups. Baserat på sitt bidrag till SQL Server-communityn har han fått utmärkelser med olika utmärkelser, inklusive den prestigefyllda ”Årets bästa författare” kontinuerligt 2020 och 2021 på SQLShack.
Raj är alltid intresserad av nya utmaningar så om du behöver rådgivning hjälp om alla ämnen som omfattas av hans skrifter, han kan nås på [email protected]
Visa alla inlägg av Rajendra Gupta

Senaste inlägg av Rajendra Gupta (se alla)
  • Sessionstidsavbrott i SQL Server Alltid tillgängligt Grupper – 8 februari 2021
  • Utför uppgraderingar av mindre och större versioner för AWS RDS SQL Server – 29 januari 2021
  • Distribuera AWS RDS PostgreSQL-instanser – 27 januari 2021

Write a Comment

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