第 1 题 连续问题

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;

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值