如何确保在 BigQuery 中只选择具有最大时间戳值的行?
How to make sure only rows with max timestamp values are selected in BigQuery?
我的 table 看起来像这样:
datetime | field_a | field_b | field_c | field_d | field_e | field_f | updated_at
实际上,字段数比那个多,大约20个,a-f编号只是为了简洁。
这个 table 会定期更新,相同的行可以出现不止一次,但具有更新的值 updated_at
。
我想要实现的是 select 具有最新 updated_at
的行以避免重复(如果唯一的区别是 [=14= 的值,则行 A 和 是重复的]).
我最初的尝试是这样的:
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
起初,我以为在 PARTITION BY
子句中使用 datetime
可能就足够了,但似乎我必须包括所有字段,以便可以进行所需的重复数据删除。
这种方法有意义吗? window 函数中应包含所有字段,我是否正确?有没有更优雅的方式来实现我想要的?
示例输入:
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
查询应该return:
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)
.
的每个唯一组合的最新行
考虑以下方法
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)
如果应用于您问题中的示例数据 - 输出为
我的 table 看起来像这样:
datetime | field_a | field_b | field_c | field_d | field_e | field_f | updated_at
实际上,字段数比那个多,大约20个,a-f编号只是为了简洁。
这个 table 会定期更新,相同的行可以出现不止一次,但具有更新的值 updated_at
。
我想要实现的是 select 具有最新 updated_at
的行以避免重复(如果唯一的区别是 [=14= 的值,则行 A 和 是重复的]).
我最初的尝试是这样的:
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
起初,我以为在 PARTITION BY
子句中使用 datetime
可能就足够了,但似乎我必须包括所有字段,以便可以进行所需的重复数据删除。
这种方法有意义吗? window 函数中应包含所有字段,我是否正确?有没有更优雅的方式来实现我想要的?
示例输入:
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
查询应该return:
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)
.
考虑以下方法
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)
如果应用于您问题中的示例数据 - 输出为