2012-03-11 5 views
1

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

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

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

ответ

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

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

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

Результаты в:

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

SQL Fiddle

+1

Просто интересно ... почему (на земле) вы * право * выравнивать первый член (ы) каждой строки? – Bohemian

+1

Но это не касается дубликатов? Например, если у меня есть a 10 b 10 c 9 d 8 тогда вам нужны a, b и c, но разве это не только дает вам а и b? –

+0

Благодарим вас за комментарий @Bohemian. Я не делаю этого IRL. Кажется, легче читать, однако, для целей примеров. Видимо, не всем, тем не менее: D – bernie