Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL/Bigquery中的多重聚合_Sql_Google Bigquery - Fatal编程技术网

SQL/Bigquery中的多重聚合

SQL/Bigquery中的多重聚合,sql,google-bigquery,Sql,Google Bigquery,我有一个名为user\u state的表,其中包含user\u ID、account\u ID、Balance、Date列。每个用户id可以有多个帐户。 示例表如下所示: 您可以使用脚本创建表: CREATE TABLE USER_STATE (USER_ID int, ACCOUNT_ID int, SNAPSHOT_DATE DATE, BALANCE float); INSERT INTO USER_STATE(USER_ID,ACCOUNT_ID,SNAPSHOT_DAT

我有一个名为user\u state的表,其中包含user\u ID、account\u ID、Balance、Date列。每个用户id可以有多个帐户。 示例表如下所示: 您可以使用脚本创建表:

    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);
我希望每个用户每月获得以下值:

  • 每个用户当月的首个月日和当月首个月的余额总和
  • 每个用户当月的最后一天和当月最后一天的余额总和
  • 每个用户每月的平均余额
最终结果应如下所示:

一个解决方案是分别获得我列出的每个用户每月需要的项目,并加入表格,是否有更高效、更简单的解决方案

谢谢,
比克拉姆。按快照日期和用户进行聚合,然后按用户和月份进行聚合:

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。你能解释一下这个[序数(1)]在做什么吗?