全部產品
Search
文件中心

Hologres:QUALIFY(Beta)

更新時間:Sep 30, 2025

在SELECT語句中, 您可以使用QUALIFY子句篩選視窗函數的結果。本文為您介紹QUALIFY子句的文法和使用樣本。

QUALIFY子句在視窗函數中的作用類似於HAVING對彙總函式的作用,用於篩選視窗Function Compute後的結果。在查詢執行順序中,QUALIFY在視窗Function Compute之後進行評估。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 |
    +---+---+---+---------+