QUALIFY(Beta)

SELECT语句中, 您可以使用QUALIFY子句筛选窗口函数的结果。本文为您介绍QUALIFY子句的语法和使用示例。

QUALIFY子句在窗口函数中的作用类似于HAVING对聚合函数的作用,用于筛选窗口函数计算后的结果。在查询执行顺序中,QUALIFY在窗口函数计算之后进行评估。SELECT语句的子句通常按特定顺序依次执行:

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. WINDOW

  6. QUALIFY

  7. DISTINCT

  8. ORDER BY

  9. LIMIT

语法

QUALIFY <predicate>

包含QUALIFY的语句的一般形式类似于以下内容:

SELECT <column_list>
  FROM <data_source>
  [GROUP BY ...]
  [HAVING ...]
  QUALIFY <predicate>
  [ ... ]

参数介绍

参数名称

说明

column_list

通常遵循SELECT语句的投影子句的规则。

data_source

数据源通常是表,也可以是其他类似表的数据源,如视图等。

predicate

谓词是一种表达式,用于在计算聚合函数和窗口函数后筛选结果。谓词应类似于HAVING子句,但没有关键字HAVING。此外,谓词还可以包含窗口函数。

使用说明

  • QUALIFY子句要求在SELECT列表包含至少一个子句中指定至少一个窗口函数:

    • SELECT 列的列表。

    • QUALIFY子句的筛选谓词。

  • SELECT列表中的表达式(包括窗口函数)可以通过SELECT列表中定义的列别名来引用。

  • QUALIFY支持谓词中的聚合和子查询。对于聚合,适用与HAVING子句相同的规则。

  • QUALIFY是一个保留的词。

  • QUALIFY的 Snowflake语法不是ANSI标准的一部分。

使用示例

QUALIFY子句简化了需要对窗口函数结果进行筛选的查询。如果没有QUALIFY,筛选需要嵌套。下面的示例使用ROW_NUMBER()函数仅返回每个分区中的第一行。示例数据如下:

CREATE TABLE qt (i INTEGER, p TEXT, o INTEGER);
INSERT INTO qt (i, p, o) VALUES
    (1, 'A', 1),
    (2, 'A', 2),
    (3, 'B', 1),
    (4, 'B', 2);
  • 使用嵌套方式

    SELECT
        *
    FROM (
        SELECT
            i,
            p,
            o,
            ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num
        FROM
            qt)
    WHERE
        row_num = 1;

    返回结果如下。

    +---+---+---+---------+
    | I | P | O | ROW_NUM |
    |---+---+---+---------|
    | 1 | A | 1 |       1 |
    | 3 | B | 1 |       1 |
    +---+---+---+---------+
  • 使用QUALIFY方式

    SELECT
        i,
        p,
        o
    FROM
        qt QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1;

    返回结果如下。

    +---+---+---+
    | I | P | O |
    |---+---+---|
    | 1 | A | 1 |
    | 3 | B | 1 |
    +---+---+---+
  • 使用QUALIFY引用SELECT列列表中的窗口函数

    SELECT
        i,
        p,
        o,
        ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num
    FROM
        qt QUALIFY row_num = 1;

    返回结果如下。

    +---+---+---+---------+
    | I | P | O | ROW_NUM |
    |---+---+---+---------|
    | 1 | A | 1 |       1 |
    | 3 | B | 1 |       1 |
    +---+---+---+---------+