Jak v SQL spočítám DISTINCT přes více sloupců?


Nejlepší odpověď

v SQL lze klauzuli DISTINCT použít *** před *** seznamem výběru, vyhnout se duplicitním řádkům na výstupu nebo *** uvnitř *** agregační funkce, například COUNT. Ve druhém případě, zejména pro COUNT, je efekt, že se uvažuje o opakování hodnot pouze jednou. Jedním z řešení je, že se zřetězením navrženým Gregem Kemnitzem, kromě malé chyby a přizpůsobení v závislosti na typech sloupců a řetězcových funkcích v různých sql strojích. , col3)) FROM table;

Snadné řešení

SELECT COUNT (DISTINCT col1, col2, col3) FROM table;

pracuje s MySQL, nikoli pracuji v DB2 a nevím o jiných enginech, ale není to standardní SQL.

Další, komplikovanější řešení, které může být efektivnější, pokud je operace častá a adekvátně optimalizovaná, vyžaduje vytvoření pohled

VYTVOŘIT ZOBRAZENÍ vw JAK VYBRAT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; VYBERTE POČET (*) Z vw;

Odpovědět

mysql> vytvořit falešnou tabulku (foo tinyint (3) není null výchozí 0, bar varchar (64) není null výchozí „“) ; Dotaz v pořádku, 0 ovlivněných řádků (0,07 s)

mysql> vložte do falešných hodnot (1, „foo“), (1, „bar“), (2, „foo“), (2, „bar“), (3, „baz“), (3, „pro“); Dotaz v pořádku, 6 ovlivněných řádků (0,00 s) Záznamy: 6 Duplikáty: 0 Varování: 0

mysql> vyberte foo, bar, count (*) od falešné skupiny foo, bar; + —– + —– + ———- + | foo | bar | počet (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | pro | 1 | + —– + —– + ———- + 6 řádků v sadě (0,00 s)

mysql> vložit do falešných hodnot (1, „foo“ „), (1,“ bar „), (2,“ foo „), (2,“ bar „), (3,“ baz „), (3,“ pro „); Dotaz v pořádku, 6 ovlivněných řádků (0,00 s) Záznamy: 6 Duplikáty: 0 Varování: 0

mysql> vyberte foo, bar, count (*) od falešné skupiny foo, bar; + —– + —– + ———- + | foo | bar | počet (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | pro | 2 | + —– + —– + ———- + 6 řádků v sadě (0,00 s)

mysql>

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *