第 1 题 连续问题

Posted NC_NE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第 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;

 

以上是关于第 1 题 连续问题的主要内容,如果未能解决你的问题,请参考以下文章

第 3 题 间隔连续问题

Hive SQL 五大经典面试题

LeetCode第128题—最长连续序列—Python实现

算法题每日一练---第36天:连续子数组的最大和

一个正整数表示为n个连续正整数之和(第1届第2题)

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段