1、题目要求
如下数据为用户领取的减少碳排放量
找出连续 3 天及以上减少碳排放量在 100 以上的用户
id dt lowcarbon
1001;2021-12-12;123
1002;2021-12-12;45
1001;2021-12-13;43
1001;2021-12-13;45
1001;2021-12-13;23
1002;2021-12-14;45
1001;2021-12-14;230
1002;2021-12-15;45
1001;2021-12-15;23
2、建表及加载数据
create table if not exists test1(
id int comment'ID',
dt string comment'时间',
lowcarbon bigint comment'收集的碳排放量')
row format delimited fields terminated by ";";
load data local inpath '/opt/test/t1.txt' overwrite into table test1;
3、分析:
1)连续问题,一般都要分组去重或者求和,对于此题我们是分组后求和,因为一天可以收集多次能量
select
id,dt,
sum(lowcarbon) as sum_low
from test1
group by id,dt;
2)题目要求每天减少碳排放量在 100 以上,直接在上面加一个having即可
select
id,dt,
sum(lowcarbon) as sum_low
from test1
group by id,dt
having sum_low>100; t1
3)然后我们开始来找连续时间,如何判定是连续的一个时间呢?
连续,那就必须是前一个和后一个数据之间的间隔差是一样的才能算是连续
比如:
10 12 14 16 18 21 22 23 24 25
10到18之间都是间隔2所以它们可以说是一组连续的数据,
而21到25之间的间隔1所以它们可以说是一组连续的数据,
所以这个连续,就看你题目要求,比如本题我们是连续天,那就间隔就是1,
知道这个连续问题后,我们来说此题,我们怎么来得到这个间隔
我们对数据按照时间排序
row_number() over(partition by id order by dt) num
select id,dt,sum_low,
row_number() over(partition by id order by dt) num
from (
select id,dt,sum(lowcarbon) as sum_low
from test1
group by id,dt
having sum_low>100
)t1;t2
4)得到上面结果后,再用时间减排序,连续的时间减后的值是一样的
date_sub(dt,num) flag
select
id,dt,sum_low,date_sub(dt,num) flag
from (
select
id,dt,sum_low,
row_number() over(partition by id order by dt) num
from (
select
id,dt,sum(lowcarbon) as sum_low
from test1
group by id,dt
having sum_low>100
)t1
)t2;t3
5)最后统计相减后的相等的值 取大于等于3的即可
select
id,count(flag) cnt
from (
select
id,dt,sum_low,date_sub(dt,num) flag
from (
select id,dt,sum_low,
row_number() over(partition by id order by dt) num
from (
select
id,dt,sum(lowcarbon) as sum_low
from test1
group by id,dt
having sum_low>100
)t1
)t2
)t3
group by id,flag
having cnt>=3;