【问题标题】:Multiple Aggregation in SQL/BigquerySQL/Bigquery 中的多重聚合
【发布时间】:2021-02-23 21:01:13
【问题描述】:

我有一个名为 user_state 的表,其中包含 user_ID、account_id、Balance、Date 列。每个 user_id 可以有多个帐户。 示例表如下所示: https://i.stack.imgur.com/w4odf.png 您可以使用脚本创建表:

    CREATE TABLE USER_STATE (USER_ID int, ACCOUNT_ID int, SNAPSHOT_DATE DATE, BALANCE float);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,1 ,'2016-07-01', 50);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,2 ,'2016-07-01', 50);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,2 ,'2016-07-05', 80);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,1, '2016-07-27', 150);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,1,'2016-07-31', 200);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,1, '2016-08-18', 150);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,2,'2016-08-21', 250);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(23,1,'2016-08-21', 250);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,1, '2016-06-01', 10);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,2, '2016-06-01', 20);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44, 1,'2016-06-05', 40);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,1, '2016-06-27', 90);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,1, '2016-06-31', 300);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,1, '2016-09-18', 400);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,1, '2016-09-21', 200);
    INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DATE,BALANCE) VALUES(44,2, '2016-09-21', 200);

我希望每个用户每月获得这个值:

  • 每个用户当月的 first_date 和当月第一天的 sum_balance。
  • 每个用户该月的最后一个日期和该月最后一个日期的 sum_balance。
  • 每个用户每个月的平均余额。

最终结果应如下所示: https://i.stack.imgur.com/Fyjes.png

一种解决方案是获取我列出的项目,我每个用户每月需要单独并加入表格,是否有更有效和更简单的解决方案?

谢谢, 自行车

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    嗯。 . .按快照日期和用户聚合,然后按用户和月份聚合:

    select user_id, date_trunc(snapshot_date, month) as yyyymm,
           min(snapshot_date) as first_date,
           array_agg(balance order by snapshot_date limit 1)[ordinal(1)] as first_balance,
           max(snapshot_date) as first_date,
           array_agg(balance order by snapshot_date desc limit 1)[ordinal(1)] as last_balance,
           avg(balance)
    from (select user_id, snapshot_date, sum(balance) as balance
          from user_state u
          group by 1, 2
         ) u
    group by 1, 2;
    

    【讨论】:

    • 感谢您的解决方案,它可以工作,但是有一个拼写错误 eesc,应该改为 desc。你能解释一下这个 [ordinal(1)] 在做什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多