gpt4 book ai didi

sql - TOP n WITH TIES : LIMIT "with ties"? 的 PostgreSQL 等价物

转载 作者:行者123 更新时间:2023-11-29 11:16:00 30 4
gpt4 key购买 nike

我在 SQL Server 中寻找类似的东西:

SELECT TOP n WITH TIES FROM tablename

我知道 PostgreSQL 中的 LIMIT,但是否存在与上述等效的内容?我很好奇,因为它每次都会为我节省一个额外的查询。

如果我有一个表 Numbers,其属性为 nums:{10, 9, 8, 8, 2}。我想做类似的事情:

SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3

它应该返回 {10, 9, 8, 8},因为它取前 3 位加上额外的 8,因为它与另一个并列。

最佳答案

Postgres 13 终于添加了 WITH TIES .见:


no WITH TIES clause up to PostgreSQL 12 ,就像 SQL Server 中的一样.
在 PostgreSQL 中,我会将其替换为 TOP n WITH TIES .. ORDER BY <something> :

WITH cte AS (
SELECT *, rank() OVER (ORDER BY <something>) AS rnk
FROM tbl
)
SELECT *
FROM cte
WHERE rnk <= n;

要清楚, rank() 是的, dense_rank() 会是错误的(返回太多行)。
考虑 SQL Server 文档中的这句话(来自上面的链接):

For example, if expression is set to 5 but 2 additional rows match thevalues of the ORDER BY columns in row 5, the result set will contain 7 rows.

工作WITH TIES是将最后一行的所有对等节点包括在由 ORDER BY 定义的顶部 n 中条款。 rank()给出完全相同的结果。

为了确保,我使用 SQL Server 进行了测试,这里是一个 live demo .

db<> fiddle here

Postgres 12 或更早版本中大表的更快替代方案:

关于sql - TOP n WITH TIES : LIMIT "with ties"? 的 PostgreSQL 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9629953/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com