几年前使用Google的“电表”示例,我们会:
MeterID (Datastore Key) | MeterDate (Date) | ReceivedDate (Date) | Reading (double)
假设我们收到更新的信息(说,校准/破坏仪表等)并放入一个具有相同MeterID和MeterDate的新行,使用窗口函数来获取每个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(读取)”会导致窗口函数返回下一行,还是什么都没有? (然后我们可以使用NaN来表示“已删除”。)
答案 0 :(得分:1)
你的SQL看起来不错。几个建议: - 我会使用FIRST_VALUE更明确,但否则应该工作。 - 如果可以 - 使用NULL而不是NaN。或者更好的是,添加新的BOOLEAN列以标记已删除的行。