在SELECT语句中, 您可以使用QUALIFY子句筛选窗口函数的结果。本文为您介绍QUALIFY子句的语法和使用示例。
QUALIFY子句在窗口函数中的作用类似于HAVING对聚合函数的作用,用于筛选窗口函数计算后的结果。在查询执行顺序中,QUALIFY在窗口函数计算之后进行评估。SELECT语句的子句通常按特定顺序依次执行:
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
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 | +---+---+---+---------+