分组 Top-N
Top-N 查询能根据条件从表或视图中返回 N 个最顶部或最底部的记录。
在 RisingWave 中,一个 Top-N 查询包括一个排名函数子句和一个排名过滤条件。在排名函数子句中,您可以包含一个 PARTITION BY
子句来获取每个组的前 N 行。
句法
SELECT [column_list]
FROM (
SELECT [column_list],
ranking_function_clause AS rank
FROM table_name)
WHERE rank_range;
ranking_function_clause
的句法是:
function_name() OVER ([PARTITION BY col1[, col2...]]
ORDER BY col1 [ ASC | DESC ][, col2 [ ASC | DESC ]...])
note
rank
不能包含在 column_list
中。
info
您必须严格遵循这个模式来构造一个有效的 Top-N 查询。
参数 | 描述 |
---|---|
function_name | RisingWave 在 top-N 查询中支持两个窗口函数:
|
PARTITION BY 子句 | 指定分区列。每个分区将有一个 Top-N 结果。 |
ORDER BY 子句 | 指定行的排序方式。 |
rank_range | 指定排名号的范围。排名范围是识别为 top-N 查询所必需的。范围可以用这些形式指定。 示例: WHERE M < rank AND rank < N 或 WHERE rank between M and N 。可选地,您可以指定任何附加条件以进一步过滤结果。 |
示例
创建表
CREATE TABLE t (x int, y int, z int);
插入数据
INSERT INTO t (x, y, z) VALUES
(1, 10, 50),
(1, 10, 60),
(1, 10, 70),
(1, 11, 55),
(1, 11, 65),
(2, 20, 30),
(2, 20, 40),
(2, 21, 25),
(2, 21, 35),
(2, 21, 45);
运行一个 top-N 查询
SELECT r1
FROM (
SELECT
*,
row_number() OVER (PARTITION BY x ORDER BY y) r
FROM t
) Q
WHERE Q.r1 < 10;