2015-02-02 2 views
1

Предположим, что есть 3 строки в таблице PostgreSQL с именем tracker. Я хочу получить последнюю обновленную запись. Пожалуйста, помогите мне достичь этого.Запрос максимальной отметки времени из PostgreSQL DB

(issue_id,priority,ingest_date) 
(1,1,"2015-01-27 00:00:00") 
(1,2,"2015-01-28 00:00:00") 
(1,3,"2015-01-29 00:00:00") 

Я попытался дать

select * 
from tracker 
where ingest_date = (select max(ingest_date) from tracker); 

Это прекрасно работает для меня. Но есть ли лучший способ я могу запросить БД?

Заранее спасибо.

Я хочу что-то вроде

select * 
from etl_change_fact 
where ingest_date = max(ingest_date); 

Но я получаю эту ошибку

**ERROR: aggregates not allowed in WHERE clause 
** 
+0

Если у вас есть индекс на 'ingest_date' ваш первый запрос, вероятно, наиболее эффективный способ сделать это. –

+0

Я согласен с лошадью. Предполагая индекс, подзапрос превратит тот, который большинством других методов будет индексировать или сканировать таблицу в поисках индекса. Очень эффективный. – TommCatt

ответ

2

Вы можете сделать это следующим образом. Просто выберите последнюю запись ...

SELECT * from tracker ORDER BY ingest_date DESC LIMIT 1 

Этот запрос всегда будет возвращать только одну запись. Ваш запрос может возвращать несколько строк, если ingest_date содержит дубликаты.

1

Если вы знаете, что ingest_date является уникальным (то есть, есть только одна строка, которая является последним), вы можете использовать fetch first пункт:

SELECT  * 
FROM  tracker 
ORDER BY ingest_date DEXC 
FETCH FIRST 1 ROWS ONLY 

Если это предположение не может быть сделано, вы могли бы использовать функцию rank окна, чтобы вернуть все «последние» записи:

SELECT issue_id, priority, ingest_date 
FROM (SELECT issue_id, priority, ingest_date, 
       RANK() OVER (ORDER BY ingest_date DESC) AS rk 
     FROM tracker) 
WHERE rk = 1 
+0

Нет необходимости создавать окно для проблемы, это простое, 'select * from table, где col = (выберите max (col) из таблицы)' приведет к более эффективному тарифному плану. –

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