Questo articolo esplora l’operatore SQL Count Distinct per l’eliminazione le righe duplicate nel set di risultati.
Uno sviluppatore deve ottenere dati da una tabella SQL con più condizioni. A volte, vogliamo ottenere tutte le righe in una tabella ma eliminare i valori NULL disponibili. Supponiamo di voler ottenere record di clienti distinti che hanno effettuato un ordine l’anno scorso.
Andiamo avanti e abbiamo una rapida panoramica della funzione SQL Count.
Funzione SQL Count
Usiamo la funzione SQL Count aggregate per ottenere il numero di righe in L’output. Supponiamo di avere una tabella dei prodotti che contiene i record per tutti i prodotti venduti da un’azienda. Vogliamo conoscere il conteggio dei prodotti venduti nell’ultimo trimestre. Possiamo utilizzare la funzione SQL Count per restituire il numero di righe nella condizione specificata.
La sintassi della funzione SQL COUNT:
COUNT (espressione);
Per impostazione predefinita, La funzione di conteggio di SQL Server utilizza la parola chiave All. Significa che SQL Server conta tutti i record in una tabella. Include anche le righe con valori duplicati.
Creiamo una tabella di esempio e inseriamo pochi record al suo interno.
In questa tabella, abbiamo valori duplicati e anche valori NULL .
Nello screenshot seguente, possiamo notare che:
- Count (* ) include valori duplicati e valori NULL
- Count (Col1) include valori duplicati ma non include valori NULL
Supponiamo di voler conoscere i valori distinti disponibili nella tabella. Possiamo utilizzare SQL COUNT DISTINCT per farlo.
1
2
|
Seleziona conteggio (DISTINCT COL1)
da ## TestTable
|
Nell’output seguente, otteniamo solo 2 righe. SQL COUNT Distinct non elimina i valori duplicati e NULL dal set di risultati.
Vediamo un altro esempio. In questo esempio, abbiamo una tabella delle località che consiste di due colonne Città e Stato.
Ora, esegui la seguente query per scoprire un conteggio della città distinta dalla tabella.
1
2
|
SELEZIONA COUNT (DISTINCT (City))
FROM Location;
|
Restituisce il conteggio della città unica conteggio 2 (Gurgaon e Jaipur) dal nostro set di risultati.
Se guardiamo i dati, abbiamo un nome di città simile presente in un diverso stato pure. La combinazione di città e stato è unica e non vogliamo che quella combinazione univoca venga eliminata dall’output.
Possiamo utilizzare la funzione SQL DISTINCT anche su una combinazione di colonne. Verifica la combinazione di valori e rimuove se la combinazione non è univoca.
1
2
|
SELEZIONA DISTINCT Città, Stato
DA Località;
|
Non rimuove i nomi di città duplicati dall’output a causa di una combinazione univoca di valori.
Inseriamo un’altra riga nella tabella delle posizioni.
1
|
Inserisci nei valori di posizione (“Gurgaon “,” Haryana “)
|
Abbiamo 5 record in la tabella delle località. Nei dati, puoi vedere che abbiamo una combinazione di città e stato che non è univoca.
Riesegui SELECT DISTINCT e questa volta dovrebbe restituire solo 4 righe.
Non possiamo usare la funzione SQL COUNT DISTINCT direttamente con più colonne . Viene visualizzato il seguente messaggio di errore.
Possiamo utilizzare una tabella temporanea per ottenere record dalla funzione SQL DISTINCT e quindi utilizzare count (*) per controllare i conteggi delle righe.
1
2
3
4
|
SELEZIONA DISTINCT Città, Stato
in #Temp
FROM Location;
Seleziona count (*) da #Temp
|
Otteniamo il conteggio delle righe 4 nell’output.
Se usiamo una combinazione di colonne per distinguere valori e qualsiasi colonna contiene valori NULL, diventa anche una combinazione univoca per SQL Server.
Per verificare ciò, inseriamo più record nella tabella delle posizioni. Non abbiamo specificato alcuno stato in questa query.
1
2
|
Inserisci nei valori della località (“Gurgaon”, “”)
Inserisci nei valori della località (città) (“Gurgaon”)
|
Diamo un’occhiata ai dati della tabella delle posizioni.
Riesegui la query per distinguerla righe dalla tabella delle posizioni.
1
2
|
SELEZIONA città e stato distinti
DA località;
|
Nell’output, possiamo vedere che non elimina la combinazione di Città e Stato con i valori vuoto o NULL.
Allo stesso modo, puoi vedere il conteggio delle righe 6 con SQL COUNT Funzione DISTINCT.
Differenza tra SELECT COUNT, COUNT (*) e SQL COUNT distinti
COUNT |
Count (*) |
Count (Distinct) |
Restituisce il numero totale di righe dopo aver soddisfatto le condizioni specificate nella clausola where. |
Restituisce il numero totale di righe dopo aver soddisfatto le condizioni specificate nella clausola where. |
Restituisce il numero distinto di righe dopo aver soddisfatto le condizioni specificate nella clausola where . |
Fornisce il conteggio delle righe. Non elimina i valori duplicati. |
Considera tutte le righe indipendentemente da qualsiasi duplicato, valori NULL. |
Fornisce un numero distinto di righe dopo l’eliminazione di valori NULL e duplicati. |
Elimina i valori NULL nell’output. |
Non elimina i valori NULL nell’output. |
Elimina i valori NULL nell’output. |
Piano di esecuzione della funzione distinta conteggio SQL
Diamo un’occhiata al piano di esecuzione effettivo della funzione SQL COUNT DISTINCT. È necessario abilitare il piano di esecuzione effettivo dalla barra dei menu SSMS come mostrato di seguito.
Esegui la query per ottenere un valore effettivo progetto esecutivo. In questo piano di esecuzione, puoi vedere i principali operatori che consumano risorse:
- Ordina (ordinamento distinto) – Costo 78%
- Scansione tabella – Costo 22%
Puoi passare il mouse sopra l’operatore di ordinamento e si apre un suggerimento con i dettagli dell’operatore.
Nelle finestre delle proprietà, inoltre, vengono visualizzati maggiori dettagli sull’operatore di ordinamento, inclusi l’allocazione della memoria, le statistiche e il numero di righe.
In una tabella con milioni di record, SQL Count Distinct potrebbe causare problemi di prestazioni perché un operatore di conteggio distinto è un operatore costoso nel piano di esecuzione effettivo.
SQL Server 2019 migliora le prestazioni dell’operatore SQL COUNT DISTINCT utilizzando una nuova funzione Approx_count_distinct. Questa nuova funzione di SQL Server 2019 fornisce un conteggio distinto approssimativo delle righe. Potrebbe esserci una leggera differenza nell’output della funzione SQL Count Distinct e Approx_Count_distinct.
È possibile sostituire SQL COUNT DISTINCT con la parola chiave Approx_Count_distinct per utilizzare questa funzione da SQL Server 2019.
1
2
|
SELEZIONA APPROX_COUNT_DISTINCT (Città)
DA Località;
|
Puoi approfondire questa funzione nella nuova funzione di SQL Server 2019 Approx_Count_Distinct.
Conclusione
In questo articolo, abbiamo esplorato la funzione SQL COUNT con vari esempi. Abbiamo anche coperto la nuova funzione SQL Approx_Count_distinct disponibile da SQL Server 2019. Suggerirei di esaminarli in base al proprio ambiente. Se hai commenti o domande, non esitare a lasciarli nei commenti di seguito.
- Autore
- Post recenti
È l’autore di una delle più grandi raccolte online gratuite di articoli su un singolo argomento, con la sua serie di 50 parti sui gruppi di disponibilità Always On di SQL Server. Sulla base del suo contributo alla comunità di SQL Server, è stato riconosciuto con vari premi tra cui il prestigioso “Miglior autore dell’anno” ininterrottamente nel 2020 e 2021 a SQLShack.
Raj è sempre interessato a nuove sfide, quindi se hai bisogno di consulenza aiuto su qualsiasi argomento trattato nei suoi scritti, può essere raggiunto a [email protected]
Visualizza tutti i post di Rajendra Gupta
- Timeout della sessione in SQL Server Always On Availability Gruppi – 8 febbraio 2021
- Esecuzione di aggiornamenti delle versioni minori e principali per AWS RDS SQL Server – 29 gennaio 2021
- Distribuzione di istanze PostgreSQL di AWS RDS – 27 gennaio 2021