我的数据是每个帐号每月一行,其中有一列用于帐户余额。 我想确定每个月有多少客户在 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 | 等等... |
感谢您的帮助,我很想知道如何做到这一点!
参见示例。
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)
;