在数仓中经常会遇到求连续的指标需求,例如求连续登录,连续区间
这里引用leetcode中求连续区间的一题举例
题解如下
select
min(log_id) start_id,
max(log_id) end_id
from (
select
log_id,
log_id-(row_number() over(ORDER BY log_id ASC)) rn
from logs
) t1
group by rn
这里我们可以使用等差数列的方法来求,等差数列可以应对几乎所有这类求连续的需求
1.使用row_number开窗,因为row_number函数生成数据项在分组中的排名,排名相等会在名次中不会留下空位
所以排序结果就为
2.可见rn相同的log_id都是连续的,等差数列减去等差数列,值才会相等,所以才会是一组
利用这一点,我们得到的结果如下
3.最后就很简单了,直接根据rn分组,将计算差值相同的分在一组,在求最大log_id和最小log_id结果就是连续区间