2016-06-27 7 views
0

У меня есть таблица в БД Postgres, который имеет следующую структуру:Выбор строки после нескольких группировок в Postgres

id | date | groupme1 | groupme2 | value 
---------------------------------------- 
1 | 
2 | 
3 | 

Теперь я хочу добиться следующего:

  1. Группировка таблицы после того, как groupme1 и groupme2
  2. Получите значение для каждой группы
  3. Но только последняя запись для каждого объединения групп (отложенная после даты)

Пример:

id | date | groupme1 | groupme2 | value 
--------------------------------------- 
    |  |  A |  1 | 4 
    |  |  A |  2 | 7 
    |  |  A |  3 | 3 
    |  |  B |  1 | 9 

Мой текущий подход выглядит следующим образом:

SELECT a.* 
FROM table AS a 
JOIN (SELECT max(id) AS id 
     FROM table 
     GROUP BY groupme1, groupme2) AS b 
ON a.id = b.id 

Проблемы этого подхода:

  • это asumes, что более высокие даты имеют более высокий идентификатор
  • Длительность

Есть ли более быстрый и лучший способ сделать это? Может ли функция окна работать с этим?

ответ

0

Я думаю, что вы просто хотите окна функции:

select t.* 
from (select t.*, 
      row_number() over (partition by groupme1, groupme2 order by date desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

Или, лучший способ сделать это в Postgres использует distinct on:

select distinct on (groupme1, groupme2) t.* 
from t 
order by groupme1, groupme2, date desc; 
+0

Оба решения работают. Это самый быстрый способ? Запуск второго по дате из базы данных из 7000 строк занимает 4,8 секунды. – Xlaech

+0

Вторая версия, вероятно, самая быстрая, и индекс на 't (groupme1, groupme2, date desc)' будет делать это быстрее. –

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

  • Нет связанных вопросов^_^