Este artigo explora o operador SQL Count Distinct para eliminar as linhas duplicadas no conjunto de resultados.
Um desenvolvedor precisa obter dados de uma tabela SQL com várias condições. Às vezes, queremos obter todas as linhas de uma tabela, mas eliminar os valores NULL disponíveis. Suponha que desejamos obter registros distintos de clientes que fizeram um pedido no ano passado.
Vamos em frente e ter uma visão geral rápida da função de contagem de SQL.
Função de contagem de SQL
Usamos a função de agregação de contagem de SQL para obter o número de linhas em a saída. Suponha que temos uma tabela de produtos que contém os registros de todos os produtos vendidos por uma empresa. Queremos saber a contagem de produtos vendidos no último trimestre. Podemos usar a função SQL Count para retornar o número de linhas na condição especificada.
A sintaxe da função SQL COUNT:
COUNT (expressão);
Por padrão, A função de contagem do SQL Server usa a palavra-chave All. Isso significa que o SQL Server conta todos os registros em uma tabela. Também inclui as linhas com valores duplicados.
Vamos criar uma tabela de amostra e inserir alguns registros nela.
Nesta tabela, temos valores duplicados e também valores NULL .
Na captura de tela a seguir, podemos observar que:
- Contagem (* ) inclui valores duplicados, bem como valores NULL
- Contagem (Col1) inclui valores duplicados, mas não inclui valores NULL
Suponha que desejamos saber os valores distintos disponíveis na tabela. Podemos usar SQL COUNT DISTINCT para fazer isso.
1
2
|
Selecione a contagem (DISTINCT COL1)
de ## TestTable
|
Na saída a seguir, obtemos apenas 2 linhas. SQL COUNT Distinct não elimina valores duplicados e NULL do conjunto de resultados.
Vejamos outro exemplo. Neste exemplo, temos uma tabela de localização que consiste em duas colunas Cidade e Estado.
Agora, execute a seguinte consulta para descobrir uma contagem da cidade distinta da tabela.
1
2
|
SELECIONE CONTAGEM (DISTINTA (Cidade))
DE Localização;
|
Ele retorna a contagem de cidade única 2 (Gurgaon e Jaipur) de nosso conjunto de resultados.
Se olharmos os dados, temos nomes de cidades semelhantes presentes em um estado também. A combinação de cidade e estado é única, e não queremos que essa combinação única seja eliminada da saída.
Podemos usar a função SQL DISTINCT em uma combinação de colunas também. Ele verifica a combinação de valores e remove se a combinação não for única.
1
2
|
SELECIONE DISTINTO Cidade, Estado
DE Localização;
|
Não remove os nomes de cidades duplicados da saída devido a uma combinação única de valores.
Vamos inserir mais uma linha na tabela de localização.
1
|
Inserir em valores de localização (“Gurgaon “,” Haryana “)
|
Temos 5 registros em a tabela de localização. Nos dados, você pode ver que temos uma combinação de cidade e estado que não é única.
Execute novamente SELECT DISTINCT e deve retornar apenas 4 linhas desta vez.
Não podemos usar a função SQL COUNT DISTINCT diretamente com as colunas múltiplas . Você recebe a seguinte mensagem de erro.
Podemos usar uma tabela temporária para obter registros da função SQL DISTINCT e, em seguida, usar count (*) para verificar a contagem de linhas.
1
2
3
4
|
SELECIONE DISTINTO Cidade, Estado
em #Temp
DE Localização;
Selecione a contagem (*) em #Temp
|
Obtemos a contagem de linhas 4 na saída.
Se usarmos uma combinação de colunas para obter dados distintos valores e qualquer uma das colunas contém valores NULL, também se torna uma combinação única para o SQL Server.
Para verificar isso, vamos inserir mais registros na tabela de localização. Não especificamos nenhum estado nesta consulta.
1
2
|
Inserir valores de localização (“Gurgaon”, “”)
Inserir valores de localização (cidade) (“Gurgaon”)
|
Vamos examinar os dados da tabela de localização.
Execute novamente a consulta para obter uma distinção linhas da tabela de localização.
1
2
|
SELECIONE uma cidade, estado distinto
DE Localização;
|
Na saída, podemos ver que não elimina a combinação de City e State com os valores em branco ou NULL.
Da mesma forma, você pode ver a contagem de 6 linhas com SQL COUNT Função DISTINCT.
Diferença entre SELECT COUNT, COUNT (*) e SQL COUNT distintos
CONTAGEM |
Contagem (*) |
Count (distinto) |
Ele retorna o número total de linhas após satisfazer as condições especificadas na cláusula where. |
Ele retorna o número total de linhas após satisfazer as condições especificadas na cláusula where. |
Ele retorna o número distinto de linhas após satisfazer as condições especificadas na cláusula where. . |
Fornece a contagem de linhas. Ele não elimina valores duplicados. |
Ele considera todas as linhas, independentemente de qualquer duplicata, valores NULL. |
Isso dá uma número distinto de linhas após a eliminação de valores NULL e duplicados. |
Ele elimina os valores NULL na saída. |
Ele não elimina os valores NULL da saída. |
Ele elimina os valores NULL da saída. |
Plano de execução da função distinta do SQL Count
Vamos examinar o plano de execução real da função SQL COUNT DISTINCT. Você precisa habilitar o plano de execução real na barra de menus do SSMS, conforme mostrado abaixo.
Execute a consulta para obter um real plano de execução. Neste plano de execução, você pode ver os principais operadores consumidores de recursos:
- Classificar (classificação distinta) – Custo 78%
- Varredura de tabela – Custo 22%
Você pode passar o mouse sobre o operador de classificação e ele abre uma dica de ferramenta com os detalhes do operador.
Nas janelas de propriedades, também obtemos mais detalhes sobre o operador de classificação, incluindo alocação de memória, estatísticas e o número de linhas.
Em uma tabela com milhões de registros, SQL Count Distinct pode causar problemas de desempenho porque um operador de contagem distinta é um operador caro no plano de execução real.
O SQL Server 2019 melhora o desempenho do operador SQL COUNT DISTINCT usando uma nova função Approx_count_distinct. Esta nova função do SQL Server 2019 fornece uma contagem distinta aproximada das linhas. Pode haver uma pequena diferença na saída da função SQL Count distinta e Approx_Count_distinct.
Você pode substituir SQL COUNT DISTINCT pela palavra-chave Approx_Count_distinct para usar esta função do SQL Server 2019.
1
2
|
SELECIONE APPROX_COUNT_DISTINCT (Cidade)
DO local;
|
Você pode explorar mais sobre essa função em A nova função do SQL Server 2019 Approx_Count_Distinct.
Conclusão
Neste artigo, exploramos a função SQL COUNT com vários exemplos. Também cobrimos a nova função SQL Approx_Count_distinct disponível no SQL Server 2019. Sugiro revisá-los de acordo com seu ambiente. Se você tiver comentários ou perguntas, fique à vontade para deixá-los nos comentários abaixo.
- Autor
- Postagens recentes
Ele é o criador de uma das maiores coleções online gratuitas de artigos sobre um único tópico, com sua série de 50 partes sobre Grupos de Disponibilidade AlwaysOn do SQL Server. Com base em sua contribuição para a comunidade do SQL Server, ele foi reconhecido com vários prêmios, incluindo o prestigioso “Melhor autor do ano” continuamente em 2020 e 2021 na SQLShack.
Raj está sempre interessado em novos desafios, então se você precisar de consultoria ajuda em qualquer assunto abordado em seus escritos, ele pode ser contatado em [email protected]
Veja todas as postagens de Rajendra Gupta
- Tempos limite de sessão no SQL Server sempre disponível Grupos – 8 de fevereiro de 2021
- Executando atualizações de versões secundárias e principais para AWS RDS SQL Server – 29 de janeiro de 2021
- Implantando instâncias AWS RDS PostgreSQL – 27 de janeiro de 2021