PostgreSQL Выбор самой последней записи для данного идентификатора - PullRequest
3 голосов
/ 28 февраля 2012

Таблица По сути выглядит так:

Серийный идентификатор, идентификатор, дата, данные, данные, данные и т. Д.

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

Может кто-нибудь помочь мне с выбором SQL?спасибо.

Ответы [ 3 ]

15 голосов
/ 28 февраля 2012

Существует около 5 различных способов сделать это, но вот один:

SELECT *
FROM yourTable AS T1 
WHERE NOT EXISTS(
    SELECT *
    FROM yourTable AS T2
    WHERE T2.ID = T1.ID AND T2.Date > T1.Date
)

А вот еще один:

SELECT T1.*
FROM yourTable AS T1
LEFT JOIN yourTable AS T2 ON
(
    T2.ID = T1.ID 
    AND T2.Date > T1.Date
)
WHERE T2.ID IS NULL

Еще один:

WITH T AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) AS rn
    FROM yourTable
)
SELECT * FROM T WHERE rn = 1

Хорошо, я увлекся, вот последнее, что я опубликую (на данный момент):

WITH T AS (
    SELECT ID, MAX(Date) AS latest_date
    FROM yourTable
    GROUP BY ID
)
SELECT yourTable.*
FROM yourTable
JOIN T ON T.ID = yourTable.ID AND T.latest_date = yourTable.Date
0 голосов
/ 22 июля 2018

Я бы использовал DISTINCT ON

CREATE VIEW your_view AS
SELECT DISTINCT ON (id) *
FROM your_table a
ORDER BY id, date DESC;

Это работает, потому что distinct on подавляет строки с дубликатами выражения в скобках.DESC в order by означает, что тот, который обычно сортируется последним, будет первым, и поэтому будет отображаться в результате.

https://www.postgresql.org/docs/10/static/sql-select.html#SQL-DISTINCT

0 голосов
/ 28 февраля 2012

Это похоже на хорошее использование для коррелированных подзапросов :

CREATE VIEW your_view AS
SELECT *
FROM your_table a
WHERE date = (
    SELECT MAX(date)
    FROM your_table b
    WHERE b.id = a.id
)

Ваш столбец даты должен будет однозначно идентифицировать каждую строку (например, тип TIMESTAMP).

...