获取至少 N 行,加上最后一行的所有对等点

Fetching a minimum of N rows, plus all peers of the last row

我有一个示例 table 命名资产,如下所示:

id name block_no
1 asset1 2
2 asset2 2
3 asset3 3

特定区块中可以有任意数量的资产。我至少需要 table 中的 100 行,并包含 block_no 中的所有数据。比如,如果 block_no 2 有 95 行,block_no 3 有大约 20 行,我需要 block_no 3 的所有 20 行,就好像我正在基于 block_no.
这可能可行吗?

Postgres 13 或更高版本

Postgres 13 或更高版本中使用 WITH TIES 有一个非常简单的解决方案:

SELECT *
FROM   assets
WHERE  block_no >= 2  -- your starting block
ORDER  BY block_no
FETCH  FIRST 100 ROWS WITH TIES;

这将 return 至少 100 行(如果足够符合条件),加上第 100 行的所有对等项。

如果您的 table 不是非常小,(block_no) 上的索引对于性能至关重要。

参见:

旧版本

在子查询中使用 window 函数 rank():

SELECT (a).*
FROM  (
   SELECT a, rank() OVER (ORDER BY block_no) AS rnk
   FROM   assets a
   ) sub
WHERE  rnk <= 100;

同样的结果。

我对行类型使用了一个小技巧来从结果中删除添加的 rnk。这是一个可选的补充。

参见:

  • PostgreSQL equivalent for TOP n WITH TIES: LIMIT "with ties"?