获取列中前2个值之一的所有行

时间:2012-03-11 03:26:19

标签: sql postgresql window-functions

我有一个包含多个条目的表格,我已根据销售标准订购了它。所以,如果条目如下:

Item  Sales
a     10
b     10
c     9
d     8
e     8
f     7

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

使用ORDER BY和LIMIT:

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

结果:

item    sales
----    -----
a       10
b       9

SQL Fiddle