基于ROW_NUMBER分区规则更新BigQuery中snapshot_date字段的方法咨询
BigQuery 更新语句实现方案
UPDATE `XXX.YYY.TABLE` t SET Snapshot_Date = DATE_SUB('2021-10-04', INTERVAL 1 DAY) WHERE Snapshot_Date = '2021-10-04' AND EXISTS ( SELECT 1 FROM ( SELECT Period, User_Struct, Num_Active_Users, ROW_NUMBER() OVER(PARTITION BY Period, User_Struct ORDER BY Num_Active_Users ASC) rn FROM `XXX.YYY.TABLE` WHERE Snapshot_Date = '2021-10-04' ) sub WHERE sub.rn = 1 AND sub.Period = t.Period AND sub.User_Struct = t.User_Struct AND sub.Num_Active_Users = t.Num_Active_Users )
逻辑说明
- 外层
UPDATE指定目标表,通过DATE_SUB动态计算前一天日期赋值给Snapshot_Date,避免手动输入日期出错 - 内层
EXISTS子句复用你的筛选逻辑,通过Period、User_Struct、Num_Active_Users三个字段关联外层表行,仅匹配你筛选出的rn=1的待更新记录 - 修正了你原有查询中窗口函数排序的不规范写法:
ROW_NUMBER的排序规则需要声明在OVER子句内,才能保证行号计算逻辑稳定
注意事项
- 执行更新前建议先替换为
SELECT COUNT(*)语句验证匹配行数,和你原有查询返回的行数一致后再执行更新操作 - 如果你的表存在唯一主键,可以将关联条件替换为主键匹配,避免字段值重复导致的误更新
内容的提问来源于stack exchange,提问作者Cameron Wasilewsky
相关产品推荐
相关产品推荐

