Моя таблица выглядит примерно так:
datetime | field_a | field_b | field_c | field_d | field_e | field_f | updated_at
На самом деле полей больше, больше около 20, нумерация от a до f просто для краткости.
Эта таблица регулярно обновляется, и одни и те же строки могут появляться несколько раз, но с более свежими значениями updated_at
.
Чего я хочу добиться, так это выбрать строки с самыми последними updated_at
, чтобы избежать дубликатов (строки A и являются дубликатами, если единственное различие заключается в значении updated_at
).
Моя первоначальная попытка выглядит примерно так:
WITH temp AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY datetime, field_a, field_b, ... field_f ORDER BY updated_at DESC) rnk
FROM some_table)
)
SELECT * FROM temp WHERE rnk = 1
Сначала я думал, что использования datetime
в предложении PARTITION BY
может быть достаточно, но кажется, что я должен включить все поля, чтобы могла произойти желаемая дедупликация.
Есть ли смысл в этом подходе? Правильно ли я понимаю, что все поля должны быть включены в оконную функцию? Есть ли более элегантный способ добиться того, чего я хочу?
Пример ввода:
datetime | field_a | field_b | field_c | field_d | field_e | field_f | updated_at
2022-04-05 | a | b | c | d | e | f | 2022-04-05T20:11:42.864086
2022-04-05 | a | b | c | d | e | f | 2022-04-05T20:22:42.864086
2022-04-04 | a | b | c | d | e | f | 2022-04-05T19:11:42.864086
2022-04-04 | a | b | c | d | e | f | 2022-04-05T19:22:42.864086
Запрос должен вернуть:
2022-04-05 | a | b | c | d | e | f | 2022-04-05T20:22:42.864086
2022-04-04 | a | b | c | d | e | f | 2022-04-05T19:22:42.864086
То есть строки, где все поля одинаковые (кроме updated_at
), а updated_at
самое большое. Другими словами, самая последняя строка для каждой уникальной комбинации (datetime, field_a, field_b, field_c, field_d, field_e, field_f)
.
Обновил сообщение
Не могли бы вы предоставить образец входных данных и ожидаемый результат?