Самый эффективный способ получить значение Last_Updated из таблицы в Postgres? - PullRequest
0 голосов
/ 11 марта 2020

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

Вариант 1 .. Присоединение основной таблицы к таблице подзапроса:

select t1.key, t1.date, t2.value
  from table1 t1
  join
    (select key,
          date,
          max(updated_at) as last_update      
          from table2
          group by 1,2) t2
    on t1.key = t2.key
    and t1.date = t2.date
    and t1.updated_at = t2.last_update 
order by 1,2;

Вариант 2 .. Подзапрос в соединении и нисходящий «порядок по» с пределом:

select t1.key, t1.date, t2.value
from table1 t1 
join table2 t2
  on t1.key = t2.key 
  and t1.date = t2.date
  and t2.updated_at = (
      select updated_at
      from table2
      where key = t2.key 
      and date = t2.date
      order by updated_at desc
      limit 1)
order by 1,2;

Вариант 2 немного нетипичен и требует упорядочения всей таблицы в подзапросе, поэтому я сомневаюсь, что это лучший метод, но он работает и позволяет подзапросу жить внутри Join, поэтому я использовал это раньше.

Является ли Вариант 1, Вариант 2 или какой-либо Вариант 3 наиболее эффективным способом решения этой проблемы? Какая лучшая практика? Рад присоединиться после просмотра стека некоторое время, спасибо всем.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Я бы предложил distinct on. Я думаю, что эта версия:

select t1.key, t1.date, t2.value
from table1 t1 join
     (select distinct on (key, date) key, date, updated_at as last_update
      from table2
      order by key, date, updated_at desc
     ) t2
     on t1.key = t2.key and
        t1.date = t2.date and
        t1.updated_at = t2.last_update 
order by 1, 2;

Однако я подозреваю, что две таблицы являются одной таблицей. Если это так, вы просто хотите:

select distinct on (key, date) t1.*
from table1 t1
order by key, date, updated_at desc
0 голосов
/ 11 марта 2020

Лучше всего:

SELECT t1.key, t1.date, t2.value
FROM table1 t1 
   JOIN table2 t2
      ON (t1.key, t1.date) = (t2.key, t2.date) 
ORDER BY t2.updated_at
LIMIT 1;

Для эффективности вам нужен индекс на table2 (updated_at) и table1 (key, date) (или table1 (key), если это достаточно избирательно). Тогда PostgreSQL может использовать быстрое вложенное соединение l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...