2015-03-26 2 views
1

У меня есть хранимая процедура, которая возвращает три столбцаГруппировка по идентификатору и 2-й колонке

| ID | EVENTS_ID | EVENT_TIME_FROM | 
| 46 | 1 | "2015-03-09 15:00:00" | 
| 46 | 2 | "2015-03-16 15:00:00" | 
| 46 | 3 | "2015-03-18 15:00:00" | 
| 47 | 4 | "2015-03-12 16:30:00" | 
| 47 | 5 | "2015-03-23 16:30:00" | 
| 47 | 6 | "2015-03-23 16:30:00" | 
| 47 | 7 | "2015-03-23 16:30:00" | 
| 47 | 8 | "2015-03-23 16:30:00" | 

Я хочу запросить все Ид + events_ids учитывая максимальное EVENT_TIME_FROM за ID

т.е. результат будет

| ID | EVENTS_ID | EVENT_TIME_FROM | 
| 46 | 3 | "2015-03-18 15:00:00" | 
| 47 | 5 | "2015-03-23 16:30:00" | 
| 47 | 6 | "2015-03-23 16:30:00" | 
| 47 | 7 | "2015-03-23 16:30:00" | 
| 47 | 8 | "2015-03-23 16:30:00" | 

Также, чтобы сделать это более трудным, таблица фактически является результатом сохраненного вызова proc и некоторой группы уже.

т.е. текущего запрос

SELECT DISTINCT id,events_id, event_time_from 
FROM my_stored_proc(...data) 
GROPU BY id, events_id, event_time_from 
ORDER BY id ,events_id ,event_time_from DESC 

Я на Postgres, попробовал несколько вещей, но не уверены.

ответ

2

Как об использовании ранжирования функции, такие как rank():

select id,events_id, event_time_from, 
from (
    select id,events_id, event_time_from, 
     rank() over (partition by id order by event_time_from desc) rnk 
    from my_stored_proc(...data) 
) t 
where rnk = 1 

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

select m.id,m.events_id,m.event_time_from 
from my_stored_proc(...data) m 
    join (
     select id, max(event_time_from) event_time_from 
     from my_stored_proc(...data) 
     group by id 
    ) t on m.id = t.id and m.event_time_from = t.event_time_from 
+0

удивительным спасибо! rank() отлично работал – dboyd68

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