Tento článek zkoumá operátor SQL Count Distinct pro eliminaci duplicitní řádky ve výsledkové sadě.
Vývojář potřebuje získat data z tabulky SQL s více podmínkami. Někdy chceme získat všechny řádky v tabulce, ale vyloučit dostupné hodnoty NULL. Předpokládejme, že chceme získat odlišné záznamy o zákaznících, kteří v minulém roce zadali objednávku.
Pojďme si udělat rychlý přehled o funkci SQL Count.
Funkce SQL Count
K získání počtu řádků použijeme agregační funkci SQL Count výstup. Předpokládejme, že máme tabulku produktů, která obsahuje záznamy o všech produktech prodávaných společností. Chceme znát počet produktů prodaných během posledního čtvrtletí. Můžeme použít funkci SQL Count k vrácení počtu řádků v zadané podmínce.
Syntaxe funkce SQL COUNT:
COUNT (výraz);
Ve výchozím nastavení Funkce počtu serverů SQL používá klíčové slovo Vše. To znamená, že SQL Server počítá všechny záznamy v tabulce. Zahrnuje také řádky, které mají také duplicitní hodnoty.
Vytvořme ukázkovou tabulku a vložte do ní několik záznamů.
V této tabulce máme také duplicitní hodnoty a hodnoty NULL .
Na následujícím snímku obrazovky můžeme poznamenat, že:
- Count (* ) zahrnuje duplicitní hodnoty i hodnoty NULL
- Count (Col1) zahrnuje duplicitní hodnoty, ale nezahrnuje hodnoty NULL
Předpokládejme, že chceme znát odlišné hodnoty dostupné v tabulce. Můžeme k tomu použít SQL COUNT DISTINCT.
1
2
|
Vyberte počet (DISTINCT COL1)
z ## TestTable
|
V následujícím výstupu dostaneme pouze 2 řádky. Rozdíl SQL COUNT nevylučuje duplicitní a NULL hodnoty ze sady výsledků.
Podívejme se na další příklad. V tomto příkladu máme tabulku umístění, která se skládá ze dvou sloupců Město a stát.
Nyní proveďte následující dotaz a zjistěte počet odlišných měst z tabulky.
1
2
|
VYBERTE POČET (DISTINCT (město))
Z místa;
|
Vrací počet jedinečných měst 2 (Gurgaon a Jaipur) z naší sady výsledků.
Pokud se podíváme na data, máme podobný název města v jiné stát také. Kombinace města a státu je jedinečná a my nechceme, aby tato jedinečná kombinace byla z výstupu vyloučena.
Funkci SQL DISTINCT můžeme použít také na kombinaci sloupců. Zkontroluje kombinaci hodnot a odstraní, pokud kombinace není jedinečná.
1
2
|
VYBERTE DISTINCT město, stát
Z místa;
|
Neodstraní duplicitní názvy měst z výstupu z důvodu jedinečné kombinace hodnot.
Vložme do tabulky umístění ještě jeden řádek.
1
|
Vložit do hodnot umístění („Gurgaon“ „,“ Haryana „)
|
Máme 5 záznamů v tabulku umístění. V datech můžete vidět, že máme jednu kombinaci města a státu, která není jedinečná.
Znovu spusťte příkaz SELECT DISTINCT funkce a tentokrát by měla vrátit pouze 4 řádky.
Funkci SQL COUNT DISTINCT nemůžeme použít přímo s více sloupci . Zobrazí se následující chybová zpráva.
K získání záznamů z funkce SQL DISTINCT můžeme použít dočasnou tabulku a poté použít count (*) pro kontrolu počtu řádků.
1
2
3
4
|
VYBERTE DISTINCT město, stát
do #Temp
Z místa;
Vyberte počet (*) z #Temp
|
Na výstupu dostaneme počet řádků 4.
Pokud použijeme kombinaci sloupců, abychom získali odlišné hodnoty a kterýkoli ze sloupců obsahuje hodnoty NULL, stává se také jedinečnou kombinací pro SQL Server.
Chcete-li to ověřit, vložte do tabulky umístění více záznamů. V tomto dotazu jsme nezadali žádný stav.
1
2
|
Vložit do hodnot lokalit („Gurgaon“, „“)
Vložit do hodnot lokalit (město) („Gurgaon“)
|
Podívejme se na data tabulky umístění.
Znovu spusťte dotaz, abyste získali odlišnost řádky z tabulky umístění.
1
2
|
VYBERTE odlišné město, stát
Z místa;
|
Na výstupu vidíme, že nevylučuje kombinace City a State s prázdnými nebo NULL hodnotami.
Podobně můžete vidět počet řádků 6 s SQL COUNT Funkce DISTINCT.
Rozdíl mezi SELECT COUNT, COUNT (*) a SQL COUNT odlišný
POČET |
počet (*) |
Count (Distinct) |
Vrátí celkový počet řádků po splnění podmínek uvedených v klauzuli where. |
Vrací celkový počet řádků po splnění podmínek uvedených v klauzuli where. |
Vrací zřetelný počet řádků po splnění podmínek uvedených v klauzuli where . |
Udává počet řádků. Nevylučuje duplicitní hodnoty. |
Zvažuje všechny řádky bez ohledu na duplicitní hodnoty NULL. |
Poskytuje zřetelný počet řádků po odstranění NULL a duplicitních hodnot. |
Odstraní hodnoty NULL ve výstupu. |
Nevylučuje hodnoty NULL ve výstupu. |
Odstraňuje hodnoty NULL ve výstupu. |
Plán provádění odlišné funkce počtu SQL
Podívejme se na plán skutečného provedení funkce SQL COUNT DISTINCT. Je třeba povolit plán skutečného provedení z lišty nabídky SSMS, jak je uvedeno níže.
Provedením dotazu získáte skutečný plán exekuční plán. V tomto plánu provádění můžete vidět nejvýznamnější operátory náročné na zdroje:
- Řazení (odlišné řazení) – náklady 78%
- Prohledávání tabulky – náklady 22%
Můžete umístit ukazatel myši nad operátor řazení a otevře tip nástroje s podrobnostmi operátoru.
V oknech vlastností také získáme více podrobností o operátoru řazení, včetně alokace paměti, statistik a počtu řádků.
V tabulce s miliony záznamů může odlišný počet SQL způsobit problémy s výkonem, protože samostatný operátor počtu je nákladným operátorem v skutečný plán provádění.
SQL Server 2019 zlepšuje výkon operátora SQL COUNT DISTINCT pomocí nové funkce Approx_count_distinct. Tato nová funkce serveru SQL Server 2019 poskytuje přibližný odlišný počet řádků. Může existovat mírný rozdíl ve výstupním počtu funkcí SQL Count a Approx_Count_distinct.
Chcete-li použít tuto funkci ze serveru SQL Server 2019, můžete nahradit SQL COUNT DISTINCT klíčovým slovem Přibližný počet_rozlišení.
1
2
|
VÝBĚR APPROX_COUNT_DISTINCT (město)
Z místa;
|
Více o této funkci můžete prozkoumat v nové funkci serveru SQL Server 2019 Přibližný počet_výrazů.
Závěr
V tomto článku jsme prozkoumali funkci SQL COUNT s různými příklady. Pokryli jsme také novou funkci SQL Approx_Count_distinct dostupnou na serveru SQL Server 2019. Navrhoval bych je zkontrolovat podle vašeho prostředí. Pokud máte nějaké komentáře nebo dotazy, můžete je zanechat v komentářích níže.
- Autor
- Poslední příspěvky
Je tvůrcem jedné z největších bezplatných online sbírek článků na jedno téma se svou 50dílnou sérií pro skupiny dostupnosti na serveru SQL Server. Na základě svého příspěvku pro komunitu SQL Server byl oceněn různými oceněními, včetně prestižního ocenění „Nejlepší autor roku“ průběžně v letech 2020 a 2021 na serveru SQLShack.
Raj se vždy zajímá o nové výzvy, takže pokud potřebujete poradit pomoc s jakýmkoli tématem obsaženým v jeho spisech, lze ho kontaktovat na adrese [email protected]
Zobrazit všechny příspěvky od Rajendra Gupta
- Časové limity relací na serveru SQL Server vždy dostupné Skupiny – 8. února 2021
- Provádění upgradů menších a hlavních verzí pro AWS RDS SQL Server – 29. ledna 2021
- Nasazení instancí AWS RDS PostgreSQL – 27. ledna 2021