2015-06-24 12 views
1

Учитывая таблицы:Выберите все записи типа «х», которые являются самой высокой «версией»

Agreement: 
    id: int 
    type: string 
    version: int 

Указанных отчетов, как:

1 | Terms | 1 
2 | Terms | 2 
3 | Privacy | 1 

Я хотел бы запрос, который выводит:

2 | Terms | 2 
3 | Privacy | 1 

Я пробовал всевозможные отличительные и самостоятельные присоединения к max (версии), я просто не могу его взломать.

+0

Почему все строки имеют одинаковый идентификатор? – Mureinik

+0

Я быстро печатал .. :) – Prescott

ответ

3

Легче всего было бы, вероятно, будет использовать функцию rank окна:

SELECT id, type, version 
FROM (SELECT id, type, version, 
       RANK() OVER (PARTITION BY type ORDER BY version DESC) AS rk 
     FROM agreement) t 
WHERE rk = 1 
2

Он должен работать:

select max(id) , type , max(version) from Agreement 
group by type 
+0

Это не похоже на фильтрацию строк вообще – Prescott

+3

Это будет работать с исходными данными OP, но с одинаковым идентификатором на всех строках оказалось опечаткой - см. Комментарии на вопрос. С обновленными данными этот ответ больше не верен. – Mureinik

+0

Извинения, это было мое плохо :( – Prescott

1

Попробуйте это:

SELECT a.id, a.type, a.version 
FROM Agreement AS a 
INNER JOIN (SELECT type, MAX(version) AS maxV 
      FROM Agreement 
      GROUP BY type) t 
ON t.type = a.type AND a.version = t.maxV 

Этот запрос использует полученный таблицу, содержащую MAX(version) за type. Присоединяясь к этой производной таблице, мы можем получить все строки исходной таблицы, имеющие максимальную версию за type.

Demo here

0

Postgresql:

выберите * из соглашения о котором идентификатор в (выбрать идентификатор из договора б, где a.type = b.type упорядочить по убыванию идентификатора предела 1)

Результат:

2 | Условия использования | 2

3 | Конфиденциальность | 1

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