Как «дедуплицировать» строки на основе последних обновлений - PullRequest
0 голосов
/ 03 ноября 2018

Допустим, у меня есть таблица, содержимое которой выглядит как

ID     Name      Last Update
============================
1      A         1 JAN 2018
1      A         2 JAN 2018
1      A         3 JAN 2018
2      B         3 JAN 2018
2      B         6 JAN 2018

Я хочу получить результат

ID     Name      Last Update
============================
1      A         3 JAN 2018
2      B         6 JAN 2018

Как я могу это сделать?

Я попытался сгруппировать по идентификатору, но как мне получить самые последние?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Хотя решение @ Nik может работать в ситуациях, когда нет никаких связей для значений MAX(date) (или не имеет значения, какое значение связи выбрано и генерирует ли это несколько выходных строк), альтернативным подходом является группировка все записи по ID сортируют все записи, принадлежащие одной группе, по date в порядке убывания, а затем выбирают самую первую строку результатов для каждой группы.

Этого можно добиться с помощью стандартной оконной функции SQL ROW_NUMBER(), например:

SELECT ID, NAME, DATE
FROM (
      SELECT ROW_NUMBER() OVER (PARTITION BY ID 
                               ORDER BY DATE DESC) RN
            , ID
            , NAME
            , DATE
      FROM <TABLE_NAME>
      ) 
WHERE RN = 1;
0 голосов
/ 03 ноября 2018

Вы можете использовать запрос, подобный этому, чтобы получить результаты, которые вам нужны:

SELECT *
FROM   table
WHERE  (ID, date) IN (SELECT 
                            ID, MAX(Last Update) 
                      FROM table
                      GROUP BY ID)
...