【问题标题】:Query to aggregate data from table into another table based on number of entries of an id column根据 id 列的条目数查询以将表中的数据聚合到另一个表中
【发布时间】:2020-10-27 09:38:05
【问题描述】:

我有一张这样的桌子:

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 和 3,那么我只想返回 order_id start_date、end_date 和金额列中的值

如果存在多个条目,例如 for 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

【问题讨论】:

    标签: google-bigquery


    【解决方案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
    

    结果是:

    【讨论】:

    • 这不会为 order_id 2 返回错误的金额,其中 end_date 小于当前日期,并且我想返回未更正的金额,因为它只是一个条目?
    • 抱歉,已修复一个IF
    • 在对该解决方案进行了更多测试之后,它似乎不太奏效。 order_id 1 的返回值是两行而不是 1,但除了两者的总和是正确的。我只需要在同一行中同时获得 1 行的订单
    • 我不得不将查询更改为 SELECT order_id, MIN(start_date) AS start_date, MAX(end_date) AS end_date, IF(COUNT(*) > 1, SUM(IF(end_date pomengine.Testdata.test GROUP BY order_id,amount 在 GROUP BY 中包含一个金额以使其运行,这可能是它创建错误总和的原因
    • ANY 只是给我一个错误:Unexpected keyword ANY 似乎只是将 ANY 更改为 SUM 解决了它,但我不知道这是否可行以及为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2022-08-17
    • 1970-01-01
    • 2019-12-18
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多