Как убедиться, что в BigQuery выбраны только строки с максимальными значениями отметки времени?

Моя таблица выглядит примерно так:

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).

Не могли бы вы предоставить образец входных данных и ожидаемый результат?

Shipra Sarkar 05.04.2022 15:22

Обновил сообщение

Don Draper 05.04.2022 15:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрим ниже подход

select * from your_table t
qualify 1 = row_number() over win
window win as (partition by to_json_string((select as struct * except(updated_at) from unnest([t]))) order by updated_at desc)    

если применяется к выборочным данным в вашем вопросе - вывод

Другие вопросы по теме