【问题标题】:How to get sum of values in days intervals using BigQuery?如何使用 BigQuery 以天为间隔获取值的总和?
【发布时间】:2020-10-16 06:19:36
【问题描述】:

我在 BigQuery 中有两个表。第一个 t 包含每个 id 的创建日期。第二个表t0 包含每个id 每天的利润记录。 我想为每个 id 以及第一天获取第一天和第二天 30 天的利润总和列。

SELECT t.created_at, t.id, sum(t1.profit) profit_1_week, sum(t2.profit) profit_2_week, sum(t3.profit) profit_1_day FROM t
LEFT JOIN t0 t1 ON t.id = t.id AND t1.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 30 DAY)
LEFT JOIN t0 t2 ON t.id = t.id AND t2.inport_date BETWEEN DATE_ADD(t.created_at, INTERVAL 30 DAY) AND DATE_ADD(t.created_at, INTERVAL 60 DAY)
LEFT JOIN t0 t3 ON t.id = t.id AND t3.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 1 DAY)
GROUP BY t.created_at, t.id
ORDER BY t.created_at

此代码运行但总和是错误的,因为第一天的总和比每月多得多。我错在哪里以及如何解决?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    考虑使用if

    SELECT t.created_at, t.id,
      sum(if(t0.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 30 DAY), t0.profit, 0)) profit_1_week,
      sum(if(t0.inport_date BETWEEN DATE_ADD(t.created_at, INTERVAL 30 DAY) AND DATE_ADD(t.created_at, INTERVAL 60 DAY), t0.profit, 0)) profit_2_week,
      sum(if(t0.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 1 DAY), t0.profit, 0)) profit_1_day 
    FROM t
    LEFT JOIN t0 ON t.id = t0.id
    GROUP BY t.created_at, t.id
    ORDER BY t.created_at
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2017-05-27
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      相关资源
      最近更新 更多