【问题标题】:Date and time functions in BigQuery's Standard SQLBigQuery 标准 SQL 中的日期和时间函数
【发布时间】:2016-04-30 02:09:39
【问题描述】:

我试图在 BigQuery 的新标准 SQL 功能上使用我的一个 MSSQL 查询,因为它需要特殊的 JOIN 条件。但是,该参考文献尚未包含对 BigQuery 标准 SQL 中日期时间函数的任何解释。

到目前为止,我设法转换了我的 DATE_ADD 语句 来自:DATE_ADD('2015-01-01', -13, 'MONTH') 至:DATE_ADD('2015-01-01', INTERVAL -13 MONTH)

我还将 YEAR(x) 转换为 EXTRACT(YEAR FROM x)。两者似乎都是类似 MySQL 的语句。

最后我注意到大多数日期函数的输出必须使用 TIMESTAMP 进行转换,然后才能进行比较。

但现在我的查询终于要运行了,我得到一个“内部错误”。有谁知道可能出了什么问题?这是查询:

SELECT
  M,
  Bought12MBeforeM,
  Bought12MBeforeAndInM,
  (Bought12MBeforeAndInM * 1.0) / (Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate
FROM (
  SELECT
    M,
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM,
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M)
      AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM
  FROM (
    SELECT
      M,
      user_id,
      MAX(cart_creation_date) AS MaxM,
      MIN(cart_creation_date) AS MinM
    FROM (
      SELECT
        user_id,
        cart_creation_date
      FROM
        `vex-eu-cloud-sql-001.work_user.flat_orders`
      WHERE
        cart_creation_date >= TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH))
      GROUP BY
        user_id,
        cart_creation_date ) UniqueCarts
    INNER JOIN (
      SELECT
        DATE(Day) AS M
      FROM
        `vex-custom.wouter.days_2007_2020`
      WHERE
        EXTRACT(YEAR
        FROM
          Day) >= 2015
        AND EXTRACT(DAY
        FROM
          Day) = 1
        AND Day < TIMESTAMP(CURRENT_DATE()) ) Months
    ON
      cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH))
      AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH))
    GROUP BY
      M,
      user_id ) BoughtInM
  GROUP BY
    M ) Results

【问题讨论】:

  • 如果您提供工作 ID,我可以查找导致内部错误的原因
  • 嗨 Mosha,这是 vex-production:bquijob_343984cc_1545ef2e7a4
  • 好的,我在调查失败后更新了答案。

标签: google-bigquery


【解决方案1】:

该错误是由于标准 SQL 中 WHERE 子句中处理 TIMESTAMP 的错误所致。当前的解决方法是使用 UNIX_MICROS 函数将其包装以从 TIMESTAMP 转换为 INT64,然后您的查询将起作用:

SELECT
  M,
  Bought12MBeforeM,
  Bought12MBeforeAndInM,
  (Bought12MBeforeAndInM * 1.0) / (Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate
FROM (
  SELECT
    M,
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM,
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M)
      AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM
  FROM (
    SELECT
      M,
      user_id,
      MAX(cart_creation_date) AS MaxM,
      MIN(cart_creation_date) AS MinM
    FROM (
      SELECT
        user_id,
        cart_creation_date
      FROM
        `vex-eu-cloud-sql-001.work_user.flat_orders`
      WHERE
        UNIX_MICROS(cart_creation_date) >= UNIX_MICROS(TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH)))
      GROUP BY
        user_id,
        cart_creation_date ) UniqueCarts
    INNER JOIN (
      SELECT
        DATE(Day) AS M
      FROM
        `vex-custom.wouter.days_2007_2020`
      WHERE
        EXTRACT(YEAR FROM Day) >= 2015
        AND EXTRACT(DAY FROM Day) = 1
        AND UNIX_MICROS(Day) < UNIX_MICROS(TIMESTAMP(CURRENT_DATE())) ) Months
    ON
      cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH))
      AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH))
    GROUP BY
      M,
      user_id ) BoughtInM
  GROUP BY
    M ) Results

【讨论】:

  • 好的,试过了,但得到了这个:错误:TIMESTAMP_ADD 不支持 MONTH 日期部分
  • 该参考文献提到了 YEAR、DAY 和其他日期部分函数。但是所有这些都给了我:错误:找不到函数:YEAR
  • 我将更新文档以明确在 EXTRACT 函数中应使用 YEAR 和 DAY 等日期部分。
  • 成功了!谢谢莫莎。查询成功运行了两次,但现在出现资源超出错误。不再支持 EACH 关键字?
  • SQL标准中没有EACH,没有它所有的JOIN和GROUP BY都可以正常工作,请提供查询失败的job id,我们可以看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2020-08-05
  • 2017-04-08
  • 2017-04-30
相关资源
最近更新 更多