2015-02-12 2 views
2

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

col1| createtime 
d1 | 2013-01-31 22:04:15 
d1 | 2014-01-31 22:04:15 
d1 | 2015-01-31 22:04:15 
d2 | 2013-01-31 22:04:15 
d2 | 2014-01-31 22:04:15 
d2 | 2014-02-31 22:04:15 
d2 | 2015-01-31 22:04:15 
d3 | 2013-01-31 22:04:15 
d3 | 2014-01-31 22:04:15 
d3 | 2014-01-31 22:04:15 
d3 | 2015-01-31 22:04:15 
d4 | 2013-01-31 22:04:15 
d4 | 2014-01-31 22:04:15 
d4 | 2015-01-31 22:04:15 

Приведен список данных col1. Например, список данных - [d3, d4]. В результате моего запроса должны быть строки

[(d3 2015-01-31 22:04:15), (d4 2015-01-31 22:04:15)] 

потому, что последняя запись для d3 является 2015-01-31 22:04:15 и последняя запись для d4 является 2015-01-31 22:04:15

Возможно ли это без использования процедуры SQL?

ответ

1

Если у вас есть только две колонки, просто используйте group by:

select t.col1, max(t.createtime) 
from table t 
where t.col1 in ('d3', 'd4') 
group by t.col1; 

Если у вас есть более чем две колонки, я думаю, что следующий будет работать:

select t.* 
from table t 
where t.col1 in ('d3', 'd4') and 
     not exists (select 1 
        from table t2 
        where t2.col1 = t.col1 and 
         t2.createtime > t.createtime 
       ); 
1

Вы также можете использовать таблицу выражение

;WITH C AS(
    SELECT RANK() OVER (PARTITION BY col1 ORDER BY createtime DESC) AS Rnk 
      ,col1 
      ,createtime 
    FROM tableName 
) 
SELECT col1, createtime FROM C WHERE Rnk = 1 
0

Следующий пример может помочь вам в решении:

select id, max(time_stamp) 
    from (select 'd1' as id, '2013-01-31 22:04:15' as time_stamp from dual 
     union all 
     select 'd1', '2014-01-31 22:04:15' from dual 
     union all 
     select 'd1', '2015-01-31 22:04:15' from dual 
     union all 
     select 'd2', '2013-01-31 22:04:15' from dual 
     union all 
     select 'd2', '2014-01-31 22:04:15' from dual 
     union all 
     select 'd2', '2014-02-31 22:04:15' from dual 
     union all 
     select 'd2', '2015-01-31 22:04:15' from dual 
     union all 
     select 'd3', '2013-01-31 22:04:15' from dual 
     union all 
     select 'd3', '2014-01-31 22:04:15' from dual 
     union all 
     select 'd3', '2014-01-31 22:04:15' from dual 
     union all 
     select 'd3', '2015-01-31 22:04:15' from dual 
     union all 
     select 'd4', '2013-01-31 22:04:15' from dual 
     union all 
     select 'd4', '2014-01-31 22:04:15' from dual 
     union all 
     select 'd4', '2015-01-31 22:04:15' from dual) 
where id in ('d3', 'd4') 
group by id; 

Если в колонке больше столбцов, добавьте их в свою группу по полям.

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