联系时如何在 Postgres 中获得最高价值?

How to get top value in Postgres when ties?

无处不在的人 select 使用 ORDER BY 和 LIMIT 的最高价值。但是如何处理最后一个元素有重复条目的场景。

考虑 5 行 table

name number_of_cookies
matt 32
Greg 77
vance 21
chen 20
louise 77

现在我想要饼干数量最多的人。如果你这样查询

select * from table ORDER BY number_of_cookies DESC LIMIT 1;

这只会让 Louise 或 greg 中的一个人。但这里的答案是两个人都有最多的饼干。 Postgres中使用LIMIT遇到这种情况如何处理?

此外,如果我进一步扩展这个问题,如果我想列出前 10 个值,并且存在这样的情况,那么我该如何处理它?

你可以尝试类似的方法:

select * from table 
where number_of_cookies = (select max(number_of_cookies) from table)

这将 return 具有最大数量的所有名称

您可以使用 RANK 分析函数:

WITH cte AS (
    SELECT *, RANK() OVER (ORDER BY number_of_cookies DESC) rnk
    FROM yourTable
)

SELECT name, number_of_cookies
FROM cte
WHERE rnk = 1;

有一个 SQL 标准方法可以做到这一点。它不使用 LIMIT 关键字,而是使用 FETCH

FETCH FIRST 1 ROWS WITH TIES

但是直到 v13 才将对标准的 WITH TIES 部分的支持添加到 PostgreSQL。