- 类别:
/sql-reference/functions-aggregation`(通用)、:doc:/sql-reference/functions-analytic`(通用、窗口框架)
COUNT¶
返回指定列的非 NULL 记录数或记录总数。
语法¶
聚合函数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )
COUNT( * )
窗口函数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
[ PARTITION BY <expr3> ]
[ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
)
有关 window_frame
语法的详细信息,请参阅 窗口框架语法和用法。
实参¶
expr1
这应该是:
列名,可以是限定名称(例如 database.schema.table.column_name)。
Alias.*
,这表示该函数应返回不包含任何 NULLs 的行数。有关示例,请参阅 示例。
expr2
如果需要,可以包含其他列名。例如,可以计算姓氏和名字的不同组合的数量。
expr3
要分区的列(如果希望将结果拆分为多个窗口)。
expr4
要对每个窗口进行排序的列。请注意,这不同于任何用于对最终结果集进行排序的 ORDER BY 子句。
使用说明¶
该函数将 VARIANT NULL (JSON null) 视为 SQL NULL。
有关 NULL 值和聚合函数的更多信息,请参阅 聚合函数和 NULL 值。
当此函数作为聚合函数调用时:
如果使用
DISTINCT
关键字,则它适用于所有列。例如,DISTINCT col1, col2, col3
表示返回列 col1、col2 和 col3 的不同组合的数量。例如,如果数据为:1, 1, 1 1, 1, 1 1, 1, 1 1, 1, 2
然后该函数将返回 2,因为这是 3 列中值的不同组合的数量。
当此函数作为窗口函数调用时(即带有 OVER 子句):
示例¶
这是使用具有 NULL 值的 COUNT
的示例。该查询还包括一些 COUNT(DISTINCT)
运算:
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);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(*), COUNT(i_col), COUNT(DISTINCT i_col), COUNT(j_col), COUNT(DISTINCT j_col) FROM basic_example;+----------+--------------+-----------------------+--------------+-----------------------+ | COUNT(*) | COUNT(I_COL) | COUNT(DISTINCT I_COL) | COUNT(J_COL) | COUNT(DISTINCT J_COL) | |----------+--------------+-----------------------+--------------+-----------------------| | 6 | 4 | 2 | 5 | 2 | +----------+--------------+-----------------------+--------------+-----------------------+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 | +-------+----------+--------------+
以下示例显示了 COUNT(alias.*)
返回不包含任何 NULL 值的行数。
创建一组数据,以便:
1 行包含所有 null。
2 行正好有一个 null。
3 行至少有一个 null。
总共有 4 个 NULL 值。
5 行没有 null。
总共有 8 行。
CREATE TABLE non_null_counter(col1 INTEGER, col2 INTEGER); INSERT INTO non_null_counter(col1, col2) VALUES (NULL, NULL), -- all NULL values (NULL, 1), -- one NULL value (1, NULL), -- one NULL value (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);查询返回的计数为 5,即不包含任何 NULL 值的行数:
SELECT COUNT(n.*) FROM non_null_counter AS n;+------------+ | COUNT(N.*) | |------------| | 5 | +------------+
以下示例显示了 COUNT
函数将 JSON (VARIANT) NULL 视为 SQL NULL。
创建表并插入包含 SQL NULL 值和 JSON NULL 值的数据:
CREATE TABLE count_example_with_variant_column (i_col INTEGER, j_col INTEGER, v VARIANT);BEGIN WORK; -- SQL NULL for both a VARIANT column and a non-VARIANT column. INSERT INTO count_example_with_variant_column (i_col, j_col, v) VALUES (NULL, 10, NULL); -- VARIANT NULL (aka JSON null) INSERT INTO count_example_with_variant_column (i_col, j_col, v) SELECT 1, 11, PARSE_JSON('{"Title": null}'); -- VARIANT NON-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;显示数据:
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 | +-------+-------+-----------------+---------+显示
COUNT
函数将 NULL 和 VARIANT NULL (JSON null) 值都视为 NULLs。表中有 4 行。一行具有 SQL NULL,另一行具有 VARIANT NULL。这两行都从计数中排除,因此计数为 2。SELECT COUNT(v:Title) FROM count_example_with_variant_column;+----------------+ | COUNT(V:TITLE) | |----------------| | 2 | +----------------+