类别:

/sql-reference/functions-aggregation`(通用)、:doc:/sql-reference/functions-analytic`(通用、窗口框架)

COUNT

返回指定列的非 NULL 记录数或记录总数。

另请参阅:

COUNT_IFMAXMINSUM

语法

聚合函数

COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )

COUNT( * )
Copy

窗口函数

COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
                                                     [ PARTITION BY <expr3> ]
                                                     [ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
                                                     )
Copy

有关 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
      
      Copy

      然后该函数将返回 2,因为这是 3 列中值的不同组合的数量。

  • 当此函数作为窗口函数调用时(即带有 OVER 子句):

    • 如果 OVER 子句包含 ORDER BY 分子句,则:

      • 需要窗口框架。如果未明确指定窗口框架,则 ORDER BY 默认为累积窗口框架:

        RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

        有关窗口框架的信息(包括语法和示例),请参阅 窗口框架语法和用法

        有关隐含窗口框架的信息,另请参阅 窗口框架使用说明

      • 禁止在窗口函数中使用关键字 DISTINCT,否则会导致编译时错误。

  • 若要返回与条件匹配的行数,请使用 COUNT_IF

  • 如果可能,请在没有 行访问策略 的表和视图上使用 COUNT 函数。在没有行访问策略的情况下,使用此函数的查询在表或视图上更快、更准确。性能差异的原因包括:

    • Snowflake 维护有关表和视图的统计信息,此优化允许简单查询运行得更快。

    • 在表或视图上设置行访问策略并在查询中使用 COUNT 函数时,Snowflake 必须扫描每一行并确定是否允许用户查看该行。

示例

这是使用具有 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);
Copy
SELECT *
    FROM basic_example
    ORDER BY i_col;
Copy
+-------+-------+
| 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;
Copy
+----------+--------------+-----------------------+--------------+-----------------------+
| 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;
Copy
+-------+----------+--------------+
| 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);
Copy

查询返回的计数为 5,即不包含任何 NULL 值的行数:

SELECT COUNT(n.*)
    FROM non_null_counter AS n;
Copy
+------------+
| 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);
Copy
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;
Copy

显示数据:

SELECT i_col, j_col, v, v:Title
    FROM count_example_with_variant_column
    ORDER BY i_col;
Copy
+-------+-------+-----------------+---------+
| 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;
Copy
+----------------+
| COUNT(V:TITLE) |
|----------------|
|              2 |
+----------------+
语言: 中文