2016-02-20 3 views
1

У меня есть следующая таблица documentsвыбрать максимум значного столбец строка на основе нескольких столбцов

+--------+-------------+------------+----------+---------+ 
| doc_id | module_name | mapping_id | doc_type | version | 
+--------+-------------+------------+----------+---------+ 
|  5 | asdf  | asd  | POI  |  1 | 
|  6 | asdf  | asd  | POI  |  2 | 
|  7 | asdf  | asd  | CAF  |  1 | 
|  8 | asdf  | abc  | POI  |  1 | 
|  9 | asdf  | abc  | ISR  |  1 | 
|  10 | asdf  | abc  | ISR  |  2 | 
|  11 | asdf  | xyz  | POA  |  1 | 
|  12 | asdf  | xyz  | CAF  |  1 | 
|  13 | asdf  | xyz  | CAF  |  2 | 
|  14 | asdf  | xyz  | CAF  |  3 | 
|  15 | pqrs  | asd  | POI  |  1 | 
|  16 | pqrs  | asd  | POI  |  2 | 
|  17 | pqrs  | asd  | CAF  |  1 | 
|  18 | pqrs  | abc  | POI  |  1 | 
|  19 | pqrs  | abc  | ISR  |  1 | 
|  20 | pqrs  | abc  | ISR  |  2 | 
|  21 | pqrs  | xyz  | POA  |  1 | 
|  22 | pqrs  | xyz  | CAF  |  1 | 
|  23 | pqrs  | xyz  | CAF  |  2 | 
|  24 | pqrs  | xyz  | CAF  |  3 | 
+--------+-------------+------------+----------+---------+ 

, и я хочу, чтобы получить результаты, как:

+--------+-------------+------------+----------+---------+ 
| doc_id | module_name | mapping_id | doc_type | version | 
+--------+-------------+------------+----------+---------+ 
|  6 | asdf  | asd  | POI  |  2 | 
|  7 | asdf  | asd  | CAF  |  1 | 
|  8 | asdf  | abc  | POI  |  1 | 
|  10 | asdf  | abc  | ISR  |  2 | 
|  11 | asdf  | xyz  | POA  |  1 | 
|  14 | asdf  | xyz  | CAF  |  3 | 
|  16 | pqrs  | asd  | POI  |  2 | 
|  17 | pqrs  | asd  | CAF  |  1 | 
|  18 | pqrs  | abc  | POI  |  1 | 
|  20 | pqrs  | abc  | ISR  |  2 | 
|  21 | pqrs  | xyz  | POA  |  1 | 
|  24 | pqrs  | xyz  | CAF  |  3 | 
+--------+-------------+------------+----------+---------+ 

где max номер версии строка должна быть возвращена в сочетание module_name, mapping_id и doc_type.

Я не могу разобраться в запросе. Нужна помощь.

+0

Вам нужна последняя строка для каждого doc_type? – Strawberry

+0

@Strawberry: yes –

ответ

1

В большинстве баз данных вы должны использовать row_number(). В MySQL это недоступно. Одним из способов является join и group by:

select t.* 
from t join 
    (select module_name, mapping_id, doc_type, max(version) as version 
     from t 
     group by module_name, mapping_id, doc_type 
    ) tt 
    using (module_name, mapping_id, doc_type, version); 

если взять слово ор буквально, или, возможно, просто

select t.* 
from t join 
    (select doc_type, max(version) as version 
     from t 
     group by doc_type 
    ) tt 
    using (doc_type, version); 
+0

@Strawberry: вы поняли это правильно. –

+0

@Strawberry. , , Спасибо. –

1

другая альтернатива

select * 
from documents d 
where not exists 
    (
    select 1 from documents dv 
    where dv.doc_type = d.doc_type 
     and dv.version > d.version 
) 

буквально: «нет больше версия номер для тех же значений "

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