根据id列的条目数查询将数据从表聚合到另一个表

时间:2020-10-27 09:38:05

标签: google-bigquery

我有一张这样的桌子:

order_id    start_date    end_date    amount    corrected_amount
   1        2020-01-01    2020-01-31    100           95
   1        2020-02-01    2020-02-28    200          200
   1        2020-03-01    2020-03-30    100          100
   1        2020-10-01    2020-11-25    200           95
   2        2020-01-01    2020-05-30    500          250   
   3        2020-01-01    2020-12-31    400            5 

我正在尝试创建一个查询,以将其聚合到一个较小的表中,每个order_id仅包含一行,我需要使用一些我在实现时遇到一些问题的规则来将其汇总在一起。

在仅存在一个条目(例如ID 2和ID 3)的情况下,我只想从数量列中返回order_id的起始日期,结束日期和值

在存在多个像1这样的条目的情况下,我想返回order_id,最小的start_date,最大的end_date,并且对于比今天的日期“低”的每个end_date,我想总结corrected_amounts和还将其添加到end_date比今天“大”的金额。

对于上面的表格,结果看起来像

order_id     start_date    end_date   amount
   1         2020-01-01    2020-11-25   595
   2         2020-01-01    2020-05-30   500
   3         2020-01-01    2020-12-31   400

1 个答案:

答案 0 :(得分:1)

考虑使用IF

WITH TestData AS (
  SELECT 1 as order_id, DATE('2020-01-01') as start_date, DATE('2020-01-31') as end_date, 100 as amount, 95 as corrected_amount UNION ALL
  SELECT 1, DATE('2020-02-01'), DATE('2020-02-28'), 200, 200 UNION ALL
  SELECT 1, DATE('2020-03-01'), DATE('2020-03-30'), 100, 100 UNION ALL
  SELECT 1, DATE('2020-10-01'), DATE('2020-11-25'), 200, 95 UNION ALL
  SELECT 2, DATE('2020-01-01'), DATE('2020-05-30'), 500, 250 UNION ALL
  SELECT 3, DATE('2020-01-01'), DATE('2020-12-31'), 400, 5 
)
SELECT order_id,
  MIN(start_date) AS start_date,
  MAX(end_date) AS end_date,
  IF(COUNT(*) > 1,
     SUM(IF(end_date < CURRENT_DATE(), corrected_amount, amount)),
     SUM(amount)
    ) as amount
FROM TestData
GROUP BY order_id

结果是:

enter image description here