我有下面的示例表,它使用更改数据捕获来捕获历史信息:
id cdc_date cdc_flag active name
1 2020-07-12 Insert true a
2 2020-07-12 Insert true b
3 2020-07-12 Insert true c
4 2020-07-12 Insert true d
1 2020-07-13 Update false a
3 2020-07-13 Update true c_changed
4 2020-07-14 Deleted true d
对于任何列的更新,都会向表中添加一个新条目。因此,存在同一ID的多个版本。
我需要找到在每个cdc_date或之前活动的id的总数
期望输出:
cdc_date count_active
2020-07-12 4
2020-07-13 4
2020-07-14 3
我无法在Athena中形成所需输出的查询,因为没有可用的Procedures或With Recursive查询。
以下是我计算一个特定日期的活动ID的方法:
id cdc_date cdc_flag active rank
1 2020-07-12 Insert true 2
2 2020-07-12 Insert true 1
3 2020-07-12 Insert true 2
4 2020-07-12 Insert true 2
1 2020-07-13 Update false 1
3 2020-07-13 Update true 1
4 2020-07-14 Deleted true 1
Select date('2020-07-14') as cdc_date, sum(if(active = 'true',1,0)) as count_active from
(Select *, rank over (partition by id over cdc_date desc) as rank)
where rank = 1 and cdc_flag != 'Deleted' and cdc_date <= date('2020-07-14')
我需要为每个cdc_date做这件事,但需要为每个cdc_date重新计算秩,我想不出没有过程或递归的解决方案。
请使用Athena/Presto SQL对此提出解决方案。
您可以使用具有聚合的累积和:
select cdc_date,
sum(sum(case when cdc_flag = 'active' then 1
when cdc_flag = 'Deleted' then -1
else 0
end)
) over (order by cdc_date) as num_actives
from t
group by cdc_date;