2015-10-01 2 views
1

У меня есть запрос на 2 таблицы (часть, цена). Упрощенная версия этого запроса:Выбор записей из подзапроса найденных set (postgres)

SELECT price.* 
FROM price 
INNER JOIN parts ON (price.code = part.code) 
WHERE price.type = '01' 
ORDER BY date DESC 

Это возвращает несколько записей:

code  | type  | date    | price  | file 
-------------+----------+------------------------------------------------------ 
00065064705 | 01  | 2008-01-07 00:00:00 | 16.400000 | 28SEP2011.zip 
00065064705 | 01  | 2007-02-05 00:00:00 | 15.200000 | 20JUL2011.zip 
54868278900 | 01  | 2006-02-24 00:00:00 | 16.642000 | 28SEP2011.zip 

Как вы можете видеть, есть код 00065064705 в списке дважды. Мне просто нужна запись maxdate (2008-01-07) вместе с кодом, типом, датой и ценой для каждого уникального кода. Таким образом, основная запись для каждого уникального кода. Это postgres, поэтому я не могу использовать SELECT TOP или что-то в этом роде.

Я думаю, что я должен использовать это как подзапрос внутри основного запроса, но я не уверен, как это сделать. что-то вроде

SELECT * 
FROM price 
JOIN (insert my original query here) AS price2 ON price.code = price2.code 

Любая помощь была бы принята с благодарностью.

ответ

0

Вы можете использовать функцию окна row_number() для этого.

select * 
    from (SELECT price.*, 
       row_number() over (partition by price.code order by price.date desc) as rn 
      FROM price 
     INNER JOIN parts ON (price.code = part.code) 
     WHERE price.type='01') x 
where rn = 1 
ORDER BY date DESC 

(*) Примечание: Может быть, я приставкой некоторые из столбцов неправильно, так как я не уверен, какой столбец в каком таблице. Я уверен, вы можете это исправить.

+0

Я не проверить это пока я не был знаком с оконными функциями ... теперь, когда я читаю о них это дует мой разум. Отличный материал и большое спасибо за то, что нашли время, чтобы помочь :) – DrChubby

0

В Postgres можно использовать DISTINCT ON:

SELECT DISTINCT ON(code) * 
FROM price 
INNER JOIN parts ON price.code = part.code 
WHERE price.type='01' 
ORDER BY code, "date" DESC 
+0

Это сработало отлично! Раньше я пробовал просто DISTINCT, но потом группа по вопросам. Спасибо! – DrChubby

Смежные вопросы