Skip to main content

分组 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_nameRisingWave 在 top-N 查询中支持两个窗口函数:
  • row_number():返回每个排序分区中每行的连续行序号(基于 1)。
  • rank():返回有序分区中每行的序号(基于 1)排名。所有同级行接收相同的排名值。下一行或一组同级行接收的排名值会增加,增加的数量是前一个排名值的同级数量。
PARTITION BY 子句指定分区列。每个分区将有一个 Top-N 结果。
ORDER BY 子句指定行的排序方式。
rank_range指定排名号的范围。排名范围是识别为 top-N 查询所必需的。范围可以用这些形式指定。
示例:WHERE M < rank AND rank < NWHERE 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;