【问题标题】:Fetching a minimum of N rows, plus all peers of the last row获取至少 N 行,加上最后一行的所有对等点
【发布时间】:2021-12-22 16:29:42
【问题描述】:

我有一个名为 assets 的示例表,如下所示:

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

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

【问题讨论】:

  • 很有可能,使用length和where命令来完成

标签: sql postgresql sql-limit


【解决方案1】:

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;

这将返回至少 100 行(如果有足够的资格),加上第 100 行的所有同行。

如果您的表不是很小,则(block_no) 上的索引对于性能至关重要。

见:

旧版本

在子查询中使用窗口函数rank()

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

同样的结果。

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

见:

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多