- Categorias:
Funções de agregação (General) , Funções de janela
COUNT¶
Retorna o número de registros diferentes de NULL para as colunas especificadas ou o número total de registros.
Sintaxe¶
Função de agregação
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )
COUNT(*)
COUNT(<alias>.*)
Função de janela
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
[ PARTITION BY <expr3> ]
[ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
)
Para uma sintaxe window_frame
detalhada, consulte Sintaxe e uso da função de janela.
Argumentos¶
expr1
Um nome de coluna, que pode ser um nome qualificado (por exemplo, banco_de_dados.esquema.tabela.nome_da_coluna).
expr2
Você pode incluir nome(s) de coluna adicional(is), se desejar. Por exemplo, você poderia contar o número de combinações distintas de sobrenome e nome.
expr3
A coluna a ser dividida, se você quiser que o resultado seja dividido em várias janelas.
expr4
A coluna para ordenar cada janela. Note que isto é separado de qualquer cláusula ORDER BY para ordenar o conjunto de resultados finais.
*
Retorna o número total de registros.
Ao passar um curinga para a função, você pode qualificar o curinga com o nome ou alias da tabela. Por exemplo, para passar todas as colunas da tabela nomeadas
mytable
, especifique o seguinte:(mytable.*)
Também é possível usar as palavras-chave ILIKE e EXCLUDE para filtrar:
ILIKE filtra nomes de colunas que correspondem ao padrão especificado. Apenas um padrão é permitido. Por exemplo:
(* ILIKE 'col1%')
EXCLUDE filtra nomes de coluna que não correspondem à coluna ou colunas especificadas. Por exemplo:
(* EXCLUDE col1) (* EXCLUDE (col1, col2))
Os qualificadores são válidos quando você usa essas palavras-chave. O exemplo a seguir usa a palavra-chave ILIKE para filtrar todas as colunas que correspondem ao padrão
col1%
na tabelamytable
:(mytable.* ILIKE 'col1%')
As palavras-chave ILIKE e EXCLUDE não podem ser combinadas em uma única chamada de função.
Se você especificar um curinga não qualificado e não filtrado (
*
), a função retornará o número total de registros, incluindo registros com valores NULL.Se você especificar um curinga com a palavra-chave ILIKE ou EXCLUDE para filtragem, a função excluirá registros com valores NULL.
Para esta função, as palavras-chave ILIKE e EXCLUDE são válidas somente em uma lista SELECT ou cláusula GROUP BY.
Para obter mais informações sobre as palavras-chave ILIKE e EXCLUDE, consulte a seção «Parâmetros» em SELECT.
alias.*
Retorna o número de registros que não contêm nenhum valor NULL. Para um exemplo, consulte Exemplos.
Retornos¶
Retorna um valor do tipo NUMBER.
Notas de uso¶
Esta função trata JSON nulo (VARIANT NULL) como SQL NULL.
Para obter mais informações sobre valores e funções agregadas NULL, consulte Funções de agregação e valores NULL.
Quando esta função é chamada como uma função agregada:
Se a palavra-chave
DISTINCT
for usada, ela se aplica a todas as colunas. Por exemplo,DISTINCT col1, col2, col3
significa retornar o número de combinações diferentes de colunascol1
,col2
ecol3
. Por exemplo, suponha que os dados sejam:1, 1, 1 1, 1, 1 1, 1, 1 1, 1, 2
Nesse caso, a função retorna
2
, porque esse é o número de combinações distintas de valores nas três colunas.
Quando esta função é chamada como uma função de janela com uma cláusula OVER com uma cláusula ORDER BY:
O quadro de janela é exigido. Se nenhum quadro de janela for especificado explicitamente, o seguinte quadro de janela implícito será usado:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Para obter mais informações sobre quadros de janela, incluindo sintaxe, notas de uso e exemplos, consulte Sintaxe e uso da função de janela.
O uso da palavra-chave DISTINCT dentro da função de janela é proibido e resulta em um erro de tempo de compilação.
Para retornar o número de linhas que correspondem a uma condição, use COUNT_IF.
Quando possível, utilizar a função COUNT em tabelas e exibição sem uma política de acesso a linhas. A consulta com esta função é mais rápida e precisa em tabelas ou exibição sem uma política de acesso a linhas. As razões para a diferença de desempenho incluem:
O Snowflake mantém estatísticas em tabelas e exibições, e esta otimização permite que consultas simples sejam executadas mais rapidamente.
Quando uma política de acesso a linhas é definida em uma tabela ou exibição e a função COUNT é usada em uma consulta, o Snowflake deve digitalizar cada linha e determinar se o usuário tem permissão para visualizar a linha.
Exemplos¶
Os exemplos a seguir usam a função COUNT em dados com valores NULL.
Criar uma tabela e inserir valores:
CREATE TABLE basic_example (i_col INTEGER, j_col INTEGER);
INSERT INTO basic_example VALUES
(11,101), (11,102), (11,NULL), (12,101), (NULL,101), (NULL,102);
Consultar a tabela:
SELECT *
FROM basic_example
ORDER BY i_col;
+-------+-------+
| I_COL | J_COL |
|-------+-------|
| 11 | 101 |
| 11 | 102 |
| 11 | NULL |
| 12 | 101 |
| NULL | 101 |
| NULL | 102 |
+-------+-------+
SELECT COUNT(*) AS "All",
COUNT(* ILIKE 'i_c%') AS "ILIKE",
COUNT(* EXCLUDE i_col) AS "EXCLUDE",
COUNT(i_col) AS "i_col",
COUNT(DISTINCT i_col) AS "DISTINCT i_col",
COUNT(j_col) AS "j_col",
COUNT(DISTINCT j_col) AS "DISTINCT j_col"
FROM basic_example;
+-----+-------+---------+-------+----------------+-------+----------------+
| All | ILIKE | EXCLUDE | i_col | DISTINCT i_col | j_col | DISTINCT j_col |
|-----+-------+---------+-------+----------------+-------+----------------|
| 6 | 4 | 5 | 4 | 2 | 5 | 2 |
+-----+-------+---------+-------+----------------+-------+----------------+
A coluna All
nesta saída mostra que quando um curinga não qualificado e não filtrado é especificado para COUNT, a função retorna o número total de linhas na tabela, incluindo linhas com valores NULL. As outras colunas na saída mostram que quando uma coluna ou um curinga com filtragem é especificado, a função exclui linhas com valores NULL.
A próxima consulta usa a função COUNT com a cláusula GROUP BY.
SELECT i_col, COUNT(*), COUNT(j_col)
FROM basic_example
GROUP BY i_col
ORDER BY i_col;
+-------+----------+--------------+
| I_COL | COUNT(*) | COUNT(J_COL) |
|-------+----------+--------------|
| 11 | 3 | 2 |
| 12 | 1 | 1 |
| NULL | 2 | 2 |
+-------+----------+--------------+
O exemplo a seguir mostra que COUNT(alias.*)
retorna o número de linhas que não contêm nenhum valor NULL. A tabela basic_example
tem um total de seis linhas, mas três linhas têm pelo menos um valor NULL, e as outras três linhas não têm valores NULL.
SELECT COUNT(n.*) FROM basic_example AS n;
+------------+
| COUNT(N.*) |
|------------|
| 3 |
+------------+
O exemplo a seguir mostra que JSON nulo (VARIANT NULL) é tratado como SQL NULL pela função COUNT.
Crie a tabela e insira dados que contenham SQL NULL e valores nulo JSON:
CREATE OR REPLACE TABLE count_example_with_variant_column (
i_col INTEGER,
j_col INTEGER,
v VARIANT);
BEGIN WORK;
INSERT INTO count_example_with_variant_column (i_col, j_col, v)
VALUES (NULL, 10, NULL);
INSERT INTO count_example_with_variant_column (i_col, j_col, v)
SELECT 1, 11, PARSE_JSON('{"Title": null}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v)
SELECT 2, 12, PARSE_JSON('{"Title": "O"}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v)
SELECT 3, 12, PARSE_JSON('{"Title": "I"}');
COMMIT WORK;
Neste código SQL, observe o seguinte:
A primeira instrução INSERT INTO insere um SQL NULL para uma coluna VARIANT e para uma coluna não VARIANT.
A segunda instrução INSERT INTO insere um JSON nulo (VARIANT NULL).
As duas últimas instruções INSERT INTO inserem valores não NULL VARIANT.
Exibir os dados:
SELECT i_col, j_col, v, v:Title
FROM count_example_with_variant_column
ORDER BY i_col;
+-------+-------+-----------------+---------+
| I_COL | J_COL | V | V:TITLE |
|-------+-------+-----------------+---------|
| 1 | 11 | { | null |
| | | "Title": null | |
| | | } | |
| 2 | 12 | { | "O" |
| | | "Title": "O" | |
| | | } | |
| 3 | 12 | { | "I" |
| | | "Title": "I" | |
| | | } | |
| NULL | 10 | NULL | NULL |
+-------+-------+-----------------+---------+
Mostrar que a função COUNT trata os valores NULL e JSON nulo (VARIANT NULL) como NULLs. Há quatro linhas na tabela. Um tem um SQL NULL e o outro tem um JSON nulo. Ambas as linhas são excluídas da contagem, então a contagem é 2
.
SELECT COUNT(v:Title)
FROM count_example_with_variant_column;
+----------------+
| COUNT(V:TITLE) |
|----------------|
| 2 |
+----------------+