用于更新数据的 BigQuery WORM 解决方法
BigQuery WORM work-around for updated data
使用几年前 Google 的 "electric meter" 示例,我们将有:
MeterID (Datastore Key) | MeterDate (Date) | ReceivedDate (Date) | Reading (double)
假设我们收到了更新的信息(比如,calibration/busted 仪表等)并使用相同的 MeterID 和 MeterDate 放入新行,使用 Window 函数获取最新接收到的信息如果该对有多个记录,则每个 ID+MeterDate 对的日期只会花费更多,对吗?
遗憾的是,我们在没有 SQL 专家的情况下飞行,但查询似乎应该如下所示:
SELECT
meterDate,
NTH_VALUE(reading, 1) OVER (PARTITION BY meterDate ORDER BY receivedDate DESC) AS reading
FROM [BogusBQ:TableID]
WHERE meterID = {ID}
AND meterDate BETWEEN {startDate} AND {endDate}
我是不是漏掉了其他重要的东西?添加 'AND NOT IS_NAN(reading)' 会导致 Window 函数到 return 下一行,还是什么都没有? (那么我们可以用NaN来表示"deleted"。)
你的 SQL 看起来不错。几个建议:
- 我会使用 FIRST_VALUE 更明确一点,但除此之外应该可以工作。
- 如果可以 - 使用 NULL 而不是 NaN。或者更好的是,添加新的 BOOLEAN 列来标记已删除的行。
使用几年前 Google 的 "electric meter" 示例,我们将有:
MeterID (Datastore Key) | MeterDate (Date) | ReceivedDate (Date) | Reading (double)
假设我们收到了更新的信息(比如,calibration/busted 仪表等)并使用相同的 MeterID 和 MeterDate 放入新行,使用 Window 函数获取最新接收到的信息如果该对有多个记录,则每个 ID+MeterDate 对的日期只会花费更多,对吗?
遗憾的是,我们在没有 SQL 专家的情况下飞行,但查询似乎应该如下所示:
SELECT
meterDate,
NTH_VALUE(reading, 1) OVER (PARTITION BY meterDate ORDER BY receivedDate DESC) AS reading
FROM [BogusBQ:TableID]
WHERE meterID = {ID}
AND meterDate BETWEEN {startDate} AND {endDate}
我是不是漏掉了其他重要的东西?添加 'AND NOT IS_NAN(reading)' 会导致 Window 函数到 return 下一行,还是什么都没有? (那么我们可以用NaN来表示"deleted"。)
你的 SQL 看起来不错。几个建议: - 我会使用 FIRST_VALUE 更明确一点,但除此之外应该可以工作。 - 如果可以 - 使用 NULL 而不是 NaN。或者更好的是,添加新的 BOOLEAN 列来标记已删除的行。