2016-11-05 3 views
1

У меня есть таблица, в которой указано, сколько мяса FISH, VEG или OR в каждом лотке.Как выбрать максимум каждого типа

tray | qty | type 
-------+-----+------- 
    1 | 5 | FISH 
    2 | 6 | VEG 
    2 | 2 | FISH 
    2 | 5 | MEAT 
    3 | 8 | VEG 
    3 | 3 | FISH 
    3 | 9 | MEAT 
    4 | 10 | MEAT 

Позволяет вызвать эту таблицу R (это подтаблица, которую я создал в моем запросе).

То, что я хочу, это таблица, которая говорит, какой лоток имеет наибольшее количество каждого типа, как это:

type | tray 
-------+------ 
    FISH | 1 
    VEG | 3 
    MEAT | 4 

Я попытался написать следующий запрос

SELECT type AS type1, tray 
FROM (SELECT ... bla bla) AS R 
WHERE R.qty IN (SELECT MAX(qty) FROM R WHERE type = type1); 

ошибки является то, что R не существует, как я могу это решить?

+0

Я попробовал ваш запрос, он отлично работает (я предполагаю, что ваше имя таблицы 'r'). – miselking

+0

@miselking R не является таблицей в моей базе данных. R создается в запросе. Я обновил свой пост, чтобы показать, что я имею в виду – tenkii

ответ

0

Я хотел бы подойти к этому с помощью функции окна:

select r.type, r.tray 
from (select r.*, 
      row_number() over (partition by type order by qty desc) as seqnum 
     from r 
    ) r 
where seqnum = 1; 
+0

Есть ли другие решения? Я полагаю, что могу написать это с помощью конструкций, которые я узнал (никогда не видел этот раздел раньше) – tenkii

0
SELECT otr.tray, otr._type, _qty 
FROM 
    Your_Table otr 
    JOIN ( 
     SELECT _type, MAX(qty) _qty 
     FROM Your_Table 
     GROUP BY _type 
    ) A ON A._type = otr._type AND _qty = qty 
0

distinct on:

SELECT DISTINCT ON (выражение [, ...]) сохраняет только первую строку каждого набора строк, где данные выражения оцениваются равными. Выражения DISTINCT ON интерпретируются с использованием тех же правил, что и для ORDER BY (см. Выше). Обратите внимание, что «первая строка» каждого набора непредсказуема, если только ORDER BY не используется, чтобы гарантировать, что первая строка появится первой.

select distinct on (tray, type) * 
from r 
order by tray, type, qty desc 

Если distinct on не допускается, поскольку это Postgresql только тогда сделать автообъединение:

select tray, type, qty 
from 
    r 
    join (
     select type, max(qty) as qty 
     from r 
     group by type 
    ) s using (type, qty)