Tome o seguinte exemplo de código:
SELECT MaritalStatus,
COUNT(*) AS CountResult
COUNT(*) OVER() AS CountOverResult
FROM (schema).(table)
GROUP BY Marital Status
COUNT(*)
Retorna todas as linhas ignorando nulos certo?
O que COUNT(*) OVER()
faz?
Esta questão veio em um exame prático, então eu não tinha os dados para consultar. Eu tenho usado Adventure Works e este site http://www.sqlishard.com/Exercise para praticar.
Se eu inserir uma consulta como
SELECT ID, COUNT(*) AS 'COUNT(*)' , COUNT(*) OVER() AS 'COUNT(*) OVER()'
FROM Customers
GROUP BY ID
no site de prática, recebo 3794 linhas retornadas com a Count(*)
coluna cheia de unidades e a Count(*) Over()
coluna cheia do número total de linhas. Não entendi esse padrão (desculpe) então vim aqui.
Não tenho certeza do que você quer dizer com "ignorar nulos" aqui. Retorna o número de linhas independente de qualquer
NULL
sDevoluções
2
.Alterar a consulta acima para
COUNT(C)
retornaria0
como ao usarCOUNT
com uma expressão que não seja*
apenasNOT NULL
os valores dessa expressão.Suponha que a tabela em sua pergunta tenha os seguintes dados de origem
A pergunta
Devoluções
Espero que seja óbvio como esse resultado se relaciona com os dados originais.
Adicionar isso à
SELECT
lista da consulta anterior produzObserve que o conjunto de resultados tem 3 linhas e CountOverResult é 3. Isso não é uma coincidência.
A razão para isso é porque ele opera logicamente no conjunto de resultados após o
GROUP BY
.COUNT(*) OVER ()
é um agregado em janelas. A ausência de qualquer cláusulaPARTITION BY
ouORDER BY
significa que a janela na qual ela opera é todo o conjunto de resultados.No caso da consulta em sua pergunta o valor de
CountOverResult
é igual ao número deMaritalStatus
valores distintos que existem na tabela base porque há uma linha para cada um deles no resultado agrupado.count(*)
, você pode pensar nisso como contar tudo, incluindo NULLscount(*) over()
vai contar quantas linhas no seu conjunto de resultados, no seu caso, porque você fezGROUP BY
na[ID]
coluna, que eu suponho que seja uma coluna com chave primária (valores únicos e sem valores nulos), então no seu caso,count(*)
retorna o mesmo valor quecount(*) over ()
faz.Você pode testá-lo em outras colunas com valores duplicados e valores nulos.
Count(*) over () retorna o número do conjunto de resultados de sua consulta, independentemente de você ter uma condição ou não.