使用lag(value,offset)
时,我似乎无法在其他功能中重复使用输出。
以下代码的输出显示previous_timestamp_utc
存在,但转换为date()
或datediff()
的函数均未返回值。
SELECT
id,
timestamp_utc,
DATE(timestamp_utc) AS date_timestamp_utc,
previous_timestamp_utc,
DATE(previous_timestamp_utc) AS date_previous_timestamp_utc,
DATEDIFF(timestamp_utc,previous_timestamp_utc),
FROM (
SELECT
id,
timestamp_utc,
LAG(timestamp_utc,1) OVER (PARTITION BY id ORDER BY timestamp_utc) AS previous_timestamp_utc,
FROM (
SELECT
SEC_TO_TIMESTAMP (timestamp) AS timestamp_utc,
id,
num_characters,
FROM
[publicdata:samples.wikipedia] ) )
ORDER BY
4 DESC
LIMIT
1000
任何人都可以解释为什么会这样吗?
解决方法:我不清楚为什么会这样做,但有一个明确的解决方法是将lag()
字段预先投射到date()
:替换< / p>
LAG(timestamp_utc,1) OVER (PARTITION BY id ORDER BY timestamp_utc)
与
LAG(date(timestamp_utc),1) OVER (PARTITION BY id ORDER BY timestamp_utc)
导致previous_timestamp_utc
和date()
中使用datediff()
。在使用lag()
函数时,我们不应该这样做。
答案 0 :(得分:1)
这是BigQuery在使用LAG函数处理时间戳时的错误。
在中间结果期间,时间戳类型会丢失。写入表时,它将在结果表中正确写入时间戳类型,但任何中间结果都会将该类型解释为原始整数,从而导致意外结果。
您找到了解决方法:在LAG函数之前强制转换为非时间戳类型。
我们的内部问题跟踪器中记录了此问题。谢谢你的错误报告!