BigQuery SQL 努力添加“group by”命令:

问题描述 投票:0回答:1

我的数据是每个帐号每月一行,其中有一列用于帐户余额。 我想确定每个月有多少客户在 BigQuery 中连续 3 个月余额 >0。

我有这段代码可以创建“OD_USER”,这是一个 0/1 指示器,用于指示每月是否有正余额。

SELECT 
 EXTRACT(Month from Date) AS TDATE,
   ACCOUNT_ID,
   BALANCE,
    CASE WHEN BALANCE >0 THEN 1 
    ELSE 0 END AS OD_USER
 FROM  `monthly_performance` 
ORDER BY ACCOUNT_ID, TDATE

我想总结每个月有多少帐户的 RU_IND 值为 0、1、2 或 3, 其中 RU_IND 是当前月份加上前后月份的正余额数量的计数。我写了这行代码来定义RU_IND:

SUM(OD_USER) OVER(ORDER BY Date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS RU_IND

...但是此代码无法区分不同的帐号...

据我所知,BigQuery 没有

CALCULATED
作为命令,所以我必须使用子查询逻辑让我的 sql 代码识别
OD_USER
? 然后我需要总结一下
GROUP BY TDATE / RU_IND
...?

我想在一个sql步骤中完成此操作,而不创建任何表...

预期输出如下(计算唯一帐号):

SUM_0 SUM_1 SUM_2 SUM_3
1 100 200 300 400
2 150 150 350 350
3 等等...

感谢您的帮助,我很想知道如何做到这一点!

sql google-bigquery
1个回答
0
投票

参见示例。 1. 计算每个 account_id、当前、上一个和下一个余额 >0 的月份 (RU_IND)。 RU_IND 为 0、1、2 或 3,按月计算
2.分别统计RU_IND=0,RU_IND=1,RU_IND=2,RU_IND=3的账户,

SELECT Tyear,tmonth 
  ,count(*) total_accounts
  ,sum(case when ru_ind=0 then 1 else 0 end)sum_0
  ,sum(case when ru_ind=1 then 1 else 0 end)sum_1
  ,sum(case when ru_ind=2 then 1 else 0 end)sum_2
  ,sum(case when ru_ind=3 then 1 else 0 end)sum_3
FROM ( 
  SELECT ACCOUNT_ID
    ,EXTRACT(Month from Date) AS Tmonth,EXTRACT(year from Date) AS Tyear
    ,SUM(CASE WHEN BALANCE >0 THEN 1 ELSE 0 END) 
         OVER(PARTITION BY ACCOUNT_ID ORDER BY DATE 
              ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) 
      AS RU_IND 
  FROM monthly_performance as tstats
  ) 
GROUP BY Tyear,tmonth 
order by Tyear,tmonth

对于第 4 个月,我们有结果

账户 ID t月 ru_ind
1 4 2024 3
2 4 2024 2
3 4 2024 1

分组结果为(月份=4)

tyear|tmonth|total_accounts|sum_0|sum_1|sum_2|sum_3| |-:|-:|-:|-:|-:|-:|-:| |2024| 4| 3| 0| 1| 1| 1| 测试数据

create table monthly_performance (Account_id int,Date date,BALANCE float);
insert into monthly_performance values
 (1,'2024-01-01',100)
,(1,'2024-02-01',100)
,(1,'2024-03-01',100)
,(1,'2024-04-01',100)
,(1,'2024-05-01',100)
,(2,'2024-01-01',100)
,(2,'2024-02-01',-100)
,(2,'2024-03-01',-100)
,(2,'2024-04-01',100)
,(2,'2024-05-01',100)
,(3,'2024-03-01',-100)
,(3,'2024-04-01',-100)
,(3,'2024-05-01',100)
,(3,'2024-06-01',100)
,(3,'2024-07-01',100)
;  

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.