1

我有一个包含多个条目的表,并且我根据销售标准对其进行了排序。所以,如果条目是这样的:

商品销售
一个 10
b 10
c 9
d 8
8
f 7

我想提取销售额最高和第二高的商品。因此,我想提取a,bc.
PostgreSQL中是否有任何功能可以帮助解决这个问题?

4

2 回答 2

2

要包含具有前两个销售额之一的所有行,您可以使用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)
于 2012-03-11T04:06:55.073 回答
1

使用 ORDER BY 和 LIMIT:

  SELECT Item, Sales
    FROM mytable 
ORDER BY Sales DESC 
   LIMIT 2;

结果是:

商品销售
---- -----
一个 10
b 9

SQL小提琴

于 2012-03-11T03:32:29.090 回答