获取至少 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"?
我有一个示例 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"?