获取列中具有前 2 个值之一的所有行
Posted
技术标签:
【中文标题】获取列中具有前 2 个值之一的所有行【英文标题】:Get all rows with one of the top 2 values in a column 【发布时间】:2012-03-11 03:26:18 【问题描述】:我有一个包含多个条目的表格,并且我已根据销售标准对其进行排序。所以,如果条目是这样的:
商品销售 一个 10 b 10 c 9 d 8 8 f 7我想提取销售额最高和第二高的商品。像这样,
我想提取a
、b
和c
。
PostgreSQL 中有什么函数可以帮助解决这个问题吗?
【问题讨论】:
【参考方案1】:要将所有行包含在前两个销售值之一中,您可以使用dense_rank()
窗口函数:
WITH x AS (
SELECT *
,dense_rank() OVER (ORDER BY sales DESC) AS rnk
FROM tbl
)
SELECT item, sales
FROM x
WHERE rnk < 3;
为此,您需要 PostgreSQL 8.4 或更高版本。
对于旧版本,您可以:
SELECT *
FROM tbl
JOIN (
SELECT sales
FROM tbl
GROUP BY 1
ORDER BY 1 DESC
LIMIT 2
) t1 USING (sales)
【讨论】:
【参考方案2】:使用 ORDER BY 和 LIMIT:
SELECT Item, Sales
FROM mytable
ORDER BY Sales DESC
LIMIT 2;
结果:
商品销售 ---- ----- 一个 10 b 9SQL Fiddle
【讨论】:
只是好奇......为什么(在地球上)你正确对齐每行的第一个术语? 但这不会处理重复项吗?例如,如果我有一个 10 b 10 c 9 d 8 那么你会想要 a,b 和 c 但这不只给你 a 和 b 吗? 感谢您的评论,@Bohemian。我不做那个IRL。不过,出于示例的目的,似乎更容易阅读。显然不是每个人,虽然:D @AnuragChaudhury:如果有重复,你只会得到两行LIMIT 2
: sqlfiddle.com/#!1/3d58a/1
@AnuragChaudhury:我完全没有从你的问题中得到答案。您可以考虑更新问题以更好地说明这一点。以上是关于获取列中具有前 2 个值之一的所有行的主要内容,如果未能解决你的问题,请参考以下文章