Получить все строки с одним из 2 верхних значений в столбце - PullRequest
1 голос
/ 11 марта 2012

У меня есть таблица с несколькими записями, и я заказал ее в соответствии с критерием продаж.Итак, если записи похожи на:

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

Я хочу извлечь элементы с наибольшим и вторым по величине количеством продаж.Поэтому я хотел бы извлечь a, b и c.
Есть ли в PostgreSQL какая-либо функция, которая может помочь с этим?

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Чтобы включить все строки с одним из двух верхних значений продаж, можно использовать оконную функцию 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 голос
/ 11 марта 2012

Используйте ORDER BY и LIMIT:

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

Результаты:

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

SQL Fiddle

...