在SELECT語句中, 您可以使用QUALIFY子句篩選視窗函數的結果。本文為您介紹QUALIFY子句的文法和使用樣本。
QUALIFY子句在視窗函數中的作用類似於HAVING對彙總函式的作用,用於篩選視窗Function Compute後的結果。在查詢執行順序中,QUALIFY在視窗Function Compute之後進行評估。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 | +---+---+---+---------+