联系时如何在 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。
无处不在的人 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。