BigQuery - 无法重用滞后记录

时间:2015-10-28 18:06:37

标签: google-bigquery

使用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_utcdate()中使用datediff()。在使用lag()函数时,我们不应该这样做。

1 个答案:

答案 0 :(得分:1)

这是BigQuery在使用LAG函数处理时间戳时的错误。

在中间结果期间,时间戳类型会丢失。写入表时,它将在结果表中正确写入时间戳类型,但任何中间结果都会将该类型解释为原始整数,从而导致意外结果。

您找到了解决方法:在LAG函数之前强制转换为非时间戳类型。

我们的内部问题跟踪器中记录了此问题。谢谢你的错误报告!