更新时间:2026-06-29 GMT+08:00
分享

Flink常见SQL语法说明

SELECT与WHERE语句

根据WHERE子句中的条件对数据进行过滤仅返回满足条件的数据行

  • 语法:

    SELECT select_list FROM table_expression [ WHERE boolean_expression ]

  • 示例:
    SELECT price + tax FROM Orders WHERE id = 10

WITH语句

WITH子句提供了一种用于更大查询而编写辅助语句的方法。这些语句通常被称为公用表表达式,表达式可以理解为仅针对某个查询而存在的临时视图。适用于复杂查询中将子查询抽象为可复用的临时表的场景。

该语句适用于MRS 3.1.2-LTS及以上版本集群中的Flink。

  • 语法:

    WITH <with_item_definition> [ , ... ]

    SELECT ... FROM ...;

    <with_item_definition>:

    with_item_name (column_name[, ...n]) AS ( <select_query> )

  • 示例:

    定义一个公用表表达式orders_with_total ,并在一个GROUP BY查询中使用它。

    WITH orders_with_total AS (
        SELECT order_id, price + tax AS total
        FROM Orders
    )
    SELECT order_id, SUM(total)
    FROM orders_with_total
    GROUP BY order_id;

窗口聚合语句

通过窗口聚合进行分组的查询将计算每个组的单个结果行。其中窗口通过TVF(Table-Valued Function,表值函数)定义,即将窗口作为一个函数返回一张表,包含window_start和window_end字段。适用于需要按时间窗口对数据进行聚合统计的场景。

该语句适用于MRS 3.1.2-LTS及以上版本集群中的Flink。

  • 语法:

    SELECT ...

    FROM <windowed_table> -- relation applied windowing TVF

    GROUP BY window_start, window_end, …

  • 示例:
    SELECT window_start, window_end, SUM(price)
    FROM TABLE(
    TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))
    GROUP BY window_start, window_end;

窗口去重语句

Window Deduplication(窗口去重)是一种特殊的重复数据删除,它删除在一组列上重复的行,为每个窗口和分区键保留第一个或最后一个。适用于需要在时间窗口内去除重复数据的场景,例如每个窗口内只保留最新的一条记录。

该语句适用于MRS 3.2.0-LTS及以上版本集群中的Flink。

  • 语法:

    SELECT [column_list]

    FROM (

    SELECT [column_list],

    ROW_NUMBER() OVER (PARTITION BY window_start, window_end [, col_key1...]

    ORDER BY time_attr [asc|desc]) AS rownum

    FROM table_name) -- relation applied windowing TVF

    WHERE (rownum = 1 | rownum <=1 | rownum < 2) [AND conditions]

  • 示例:
    SELECT *
    FROM (
    SELECT bidtime, price, item, supplier_id, window_start, window_end,
    ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY bidtime DESC) AS rownum
    FROM TABLE(
    TUMBLE(TABLE Bid, DESCRIPTOR(bidtime), INTERVAL '10' MINUTES))
    ) WHERE rownum <= 1;

Top-N语句

Top-N查询要求按列排序的N个最小值或最大值。适用于需要获取排名前N名的场景,例如查询销量前5的商品。

该语句适用于MRS 3.1.2-LTS及以上版本集群中的Flink。

  • 语法:

    SELECT [column_list]

    FROM (

    SELECT [column_list],

    ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]]

    ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum

    FROM table_name)

    WHERE rownum <= N [AND conditions]

  • 示例:
    CREATE TABLE ShopSales (
    product_id   STRING,
    category     STRING,
    product_name STRING,
    sales        BIGINT
    ) WITH (...);
    
    SELECT *
    FROM (
    SELECT *,
    ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) AS row_num
    FROM ShopSales)
    WHERE row_num <= 5

相关文档