2013-08-28 3 views
0

В моей таблице хранятся различные версии нескольких документов.Возврат максимальных значений запроса на основе разных столбцов

------------------------------- 
| id | doc_type | download | 
------------------------------- 
| 1 | type1 | file  | 
------------------------------- 
| 2 | type2 | file  | 
------------------------------- 
| 3 | type3 | file  | 
------------------------------- 
| 4 | type1 | file  | 
------------------------------- 

В таблице хранятся разные версии документов того же типа. Мне нужно создать запрос, который будет возвращать различные типы doc_type с max (id) - это самая новая версия файла. Количество doc_types не ограничено и является динамическим. Мой запрос:

select max(id) from template_table 
where doc_type in (select distinct doct_type from template_table); 

Это возвращает только один самый большой результат. Если бы я мог сортировать результаты по идентификатору ASC, а результат предельного значения - до 4-х, но не гарантирует, что он будет возвращать различные типы doc_types. Также количество типов документов в БД может меняться с 4, чтобы подсчитать, сколько их есть.

select * from template_table 
order by id limit 4; 

Благодарим за любую помощь.

ответ

1

запрос:

SELECT t1.id, 
     t1.doc_type, 
     t1.download 
FROM template_table t1 
JOIN (SELECT MAX(id) AS id, 
       doc_typ 
     FROM template_table 
     GROUP BY doc_type) t2 
    ON t2.doc_type = t1.doc_type 
    AND t2.id = t1.id 

ИЛИ:

SELECT t1.id, 
     t1.doc_type, 
     t1.download 
FROM template_table t1 
WHERE t1.id = (SELECT MAX(t2.id) 
       FROM template_table t2 
       WHERE t2.doc_type = t1.doc_type) 
+0

Блестящая благодарность за ваш ответ Джастин. –

1

вы можете использовать GROUP BY, чтобы получить желаемый результат

select 
    doc_type 
, max(id)            AS last_id 
, max(download) KEEP (DENSE_RANK FIRST order by id desc) AS last_download 
from template_table 
group by doc_type 
; 
+0

Что держать команду делать? Является ли он специфичным для БД? –

+0

KEEP DENSE_RANK FIRST возвращает загрузку с наибольшим идентификатором для doc_type. [его поддерживает ORACLE] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions065.htm). – schurik

+0

Спасибо за ваш ответ, это очень интересно. Раньше я не встречал эту команду. –

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