SQL重叠交叉区间问题分析--HiveSQL面试题30
目 录
0 需求分析
1 数据准备
2 数据分析
3 小 结
0 需求分析
如下为平台商品促销
- 数据: 字段为品牌,打折开始日期,打折结束日期
id | stt | edt |
oppo | 2021-06-05 | 2021-06-09 |
oppo | 2021-06-11 | 2021-06-21 |
vivo | 2021-06-05 | 2021-06-15 |
vivo | 2021-06-09 | 2021-06-21 |
redmi | 2021-06-05 | 2021-06-21 |
redmi | 2021-06-09 | 2021-06-15 |
redmi | 2021-06-17 | 2021-06-26 |
huawei | 2021-06-05 | 2021-06-26 |
huawei | 2021-06-09 | 2021-06-15 |
huawei | 2021-06-17 | 2021-06-21 |
计算每个品牌总的打折销售天数。
注意:其中的交叉日期,比如vivo品牌,第一次活动时间为2021-06-05到 2021-06-15,第二次活动时间为 2021-06-09到 2021-06-21其中 9号到 15号为重复天数,只统计一次,即 vivo总打折天数为 2021-06-05到 2021-06-21共计 17天。
1 数据准备
(1) 数据
vim brand.txt
oppo 2021-06-05 2021-06-09
oppo 2021-06-11 2021-06-21
vivo 2021-06-05 2021-06-15
vivo 2021-06-09 2021-06-21
redmi 2021-06-05 2021-06-21
redmi 2021-06-09 2021-06-15
redmi 2021-06-17 2021-06-26
huawei 2021-06-05 2021-06-26
huawei 2021-06-09 2021-06-15
huawei 2021-06-17 2021-06-21
(2)建表
create table if not exists brand(id string,
stt string,
edt string)row format delimited
fields terminated by '\t';
(3) 加载数据
load data local inpath "/home/centos/dan_test/brand.txt" into table brand;
(4) 查询数据
hive> select * from brand;
OK
oppo 2021-06-05 2021-06-09
oppo 2021-06-11 2021-06-21
vivo 2021-06-05 2021-06-15
vivo 2021-06-09 2021-06-21
redmi 2021-06-05 2021-06-21
redmi 2021-06-09 2021-06-15
redmi 2021-06-17 2021-06-26
huawei 2021-06-05 2021-06-26
huawei 2021-06-09 2021-06-15
huawei 2021-06-17 2021-06-21
Time taken: 0.113 seconds, Fetched: 10 row(s)
2 数据分析
方法一:更新起始位置法
(1)比较基准点获取
问题分析:本题主要的问题点在于如何区分重叠日期。
如果数据中没有重叠的日期的话,我们正常思维就是求出每行的结束日期与开始日期的差值,并加1,然后对同一品牌的数据的计算结果进行sum就可以求出结果了。.如oppo品牌的数据。
oppo 2021-06-05 2021-06-09 (9-5+1)=5
oppo 2021-06-11 2021-06-21 (21-11+1)=11
因此oppo的活动时间为11+5=16.然而本题当中缺存在着重叠的日期,而对于重叠的日期只能记为1天
我们拿vivo品牌的数据进行分析
vivo 2021-06-05 2021-06-15 15-5+1=11
vivo 2021-06-09 2021-06-21 21-9+1=13
可以看到2021-06-09到2021-06-15之间的日期是重叠的,在2021-06-05 - 2021-06-15之间已经包含进去,如果我们按照oppo的计算方法就会多算,算出的结果24明显不对,其中重叠的日期为15-9+1=7,正确的结果为24-7=17天。
如下图所示,染色区为重叠部分,通过观察可以发现,当下一条记录的stt小于上一条记录的edt的时候出现重叠。
我们拿redmi品牌数据继续分析。
redmi 2021-06-05 2021-06-21
redmi 2021-06-09 2021-06-15
redmi 2021-06-17 2021-06-26
实际中出现重叠的部分为2个,如下图
如果按照vivo的分析方法,看下一条数据的stt是否小于上一条数据的edt,那么对于redmi品牌的数据只能分析出一个重叠区域,通过上图我们可以看出,实际上判断的是当前数据的stt是否小于之前所有记录的edt的最大值
通过上述分析判断重叠部分主要思路就是:当前行的stt是否小于基准点,基准点就是除当前行外由窗口内第一条数据到当前行的前一条数据edt的最大值。也就是说如果当前行的stt小于除当前行之外的其余之前的所有行的edt最大值时,认为是重叠部分。
具体SQL实现如下:
select id,stt,edt,max(edt) over(partition by id order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING) std_edt
from brand
对于hive 1.2.1版本执行该SQL会报如下错误:
FAILED: SemanticException End of a WindowFrame cannot be UNBOUNDED PRECEDING
事实上,在该版本下不支持rows between UNBOUNDED PRECEDING and 1 PRECEDING这样的语法,只支持rows between UNBOUNDED PRECEDING and current row这样的语法。对于hive2以后该语法被支持,可以使用。
对于上述SQL在Hive1版本中,我们用如下SQL等效实现
select id,stt,edt,lag_edt,max(lag_edt) over(partition by id order by stt rows between 1 PRECEDING and current row) as std_edtfrom(select id,stt,edt,lag(edt,1,null) over(partition by id order by stt) as lag_edtfrom brand) t
计算结果如下:
--------------------------------------------------------------------------------
OK
huawei 2021-06-05 2021-06-26 NULL NULL
huawei 2021-06-09 2021-06-15 2021-06-26 2021-06-26
huawei 2021-06-17 2021-06-21 2021-06-15 2021-06-26
oppo 2021-06-05 2021-06-09 NULL NULL
oppo 2021-06-11 2021-06-21 2021-06-09 2021-06-09
redmi 2021-06-05 2021-06-21 NULL NULL
redmi 2021-06-09 2021-06-15 2021-06-21 2021-06-21
redmi 2021-06-17 2021-06-26 2021-06-15 2021-06-21
vivo 2021-06-05 2021-06-15 NULL NULL
vivo 2021-06-09 2021-06-21 2021-06-15 2021-06-15
Time taken: 22.076 seconds, Fetched: 10 row(s)
(2)重叠部分的判断及处理
通过上述分析判断重叠部分的规则为:当前行的stt小于std_edt(基准点)的时候认为重叠部分,当遇到重叠部分时候用std_edt+1的时间点更新当前stt时间点如果当前stt大于std_edt则保持当前的stt。相当于一个指针每次判断有重叠区域,不断修改其位置。具体SQL如下:
select id,case when std_edt is null then sttwhen datediff(stt,std_edt)>0 then sttelse date_add(std_edt,1)end as stt,edt
from(select id,stt,edt,lag_edt,max(lag_edt) over(partition by id order by stt rows between 1 PRECEDING and current row) as std_edtfrom(select id,stt,edt,lag(edt,1,null) over(partition by id order by stt) as lag_edtfrom brand) t
)m
计算结果如下:
--------------------------------------------------------------------------------
OK
huawei 2021-06-05 2021-06-26
huawei 2021-06-27 2021-06-15
huawei 2021-06-27 2021-06-21
oppo 2021-06-05 2021-06-09
oppo 2021-06-11 2021-06-21
redmi 2021-06-05 2021-06-21
redmi 2021-06-22 2021-06-15
redmi 2021-06-22 2021-06-26
vivo 2021-06-05 2021-06-15
vivo 2021-06-16 2021-06-21
Time taken: 12.054 seconds, Fetched: 10 row(s)
(3)计算结果。根据步骤2计算每一行的差值,如果存在负值说明是重叠区域,该计算部分可以忽略,然后将计算的结果进行累加。具体SQL如下
select id,sum(if(diff>=0,diff+1,0)) as days
from(select id,stt,edt,datediff(edt,stt) as difffrom(select id,case when std_edt is null then sttwhen datediff(stt,std_edt)>0 then sttelse date_add(std_edt,1)end as stt,edt from(select id,stt,edt,lag_edt,max(lag_edt) over(partition by id order by stt rows between 1 PRECEDING and current row) as std_edtfrom(select id,stt,edt,lag(edt,1,null) over(partition by id order by stt) as lag_edtfrom brand) t)m) n) p
group by id
计算结果如下:
--------------------------------------------------------------------------------
OK
huawei 22
oppo 16
redmi 22
vivo 17
Time taken: 11.446 seconds, Fetched: 4 row(s)
方法2:【推荐解法】
根据窗帮大佬提供思路。这个想法非常牛逼,一起来膜拜,学习一下哈~。先上结果SQL如下:
selectid,count(distinct date_add(stt, pos-1)) as day_count
from(select id,stt,edt from brand) tmp lateral view posexplode(split(space(datediff(edt, stt)+1), '')) t as pos, val
where pos <> 0
group by id
本思路总体想法就是计算每一段相差的时间,求其总和减去重复的部分即可。其思路的巧妙之处就是将时间的差值转化成离散的序列值,最终求出每个品牌的总记录数去掉重复的即可。【补齐全集,减去重复值,集合思想】
(1)根据相差的天数生成序列值。(索引值)
生成序列值或索引值一般采用posexplode()方法,posexplode()方法不仅可以将单行转成列,而且会针对每个生成的列添加索引(生成连续的id值)。为了根据时间的差值生成索引,这里借助了空格字符串函数space()函数,space函数具体用法如下:
语法: space(int n)
返回值: string
说明:返回指定数量的空格hive> select length(space(3));
OK
3
Time taken: 0.32 seconds, Fetched: 1 row(s)hive> select split(space(3),'');
OK
[" "," "," ",""]
Time taken: 0.327 seconds, Fetched: 1 row(s)
hive> select size(split(space(3),''));
OK
4
Time taken: 0.158 seconds, Fetched: 1 row(s)
根据时间差值生成相应的空格字符串,然后通过split()函数解析,最终根据posexplode()函数生成对应的索引值。当然此处也可以用repeat()函数代替space()函数。由于split()函数解析的时候会生成多余的空串(''),所以具体操作的时候过滤掉为0的索引。具体生成索引的SQL如下:
selectid,stt,edt,t.pos
from(select id,stt,edt from brand) tmp lateral view posexplode(split(space(datediff(edt, stt)+1), '')) t as pos, val
where t.pos <> 0
注意:这里计算时间差的时候需要 加1
计算结果如下:
OK
oppo 2021-06-05 2021-06-09 1
oppo 2021-06-05 2021-06-09 2
oppo 2021-06-05 2021-06-09 3
oppo 2021-06-05 2021-06-09 4
oppo 2021-06-05 2021-06-09 5
oppo 2021-06-11 2021-06-21 1
oppo 2021-06-11 2021-06-21 2
oppo 2021-06-11 2021-06-21 3
oppo 2021-06-11 2021-06-21 4
oppo 2021-06-11 2021-06-21 5
oppo 2021-06-11 2021-06-21 6
oppo 2021-06-11 2021-06-21 7
oppo 2021-06-11 2021-06-21 8
oppo 2021-06-11 2021-06-21 9
oppo 2021-06-11 2021-06-21 10
oppo 2021-06-11 2021-06-21 11
vivo 2021-06-05 2021-06-15 1
vivo 2021-06-05 2021-06-15 2
vivo 2021-06-05 2021-06-15 3
vivo 2021-06-05 2021-06-15 4
vivo 2021-06-05 2021-06-15 5
vivo 2021-06-05 2021-06-15 6
vivo 2021-06-05 2021-06-15 7
vivo 2021-06-05 2021-06-15 8
vivo 2021-06-05 2021-06-15 9
vivo 2021-06-05 2021-06-15 10
vivo 2021-06-05 2021-06-15 11
vivo 2021-06-09 2021-06-21 1
vivo 2021-06-09 2021-06-21 2
vivo 2021-06-09 2021-06-21 3
vivo 2021-06-09 2021-06-21 4
vivo 2021-06-09 2021-06-21 5
vivo 2021-06-09 2021-06-21 6
vivo 2021-06-09 2021-06-21 7
vivo 2021-06-09 2021-06-21 8
vivo 2021-06-09 2021-06-21 9
vivo 2021-06-09 2021-06-21 10
vivo 2021-06-09 2021-06-21 11
vivo 2021-06-09 2021-06-21 12
vivo 2021-06-09 2021-06-21 13
redmi 2021-06-05 2021-06-21 1
redmi 2021-06-05 2021-06-21 2
redmi 2021-06-05 2021-06-21 3
redmi 2021-06-05 2021-06-21 4
redmi 2021-06-05 2021-06-21 5
redmi 2021-06-05 2021-06-21 6
redmi 2021-06-05 2021-06-21 7
redmi 2021-06-05 2021-06-21 8
redmi 2021-06-05 2021-06-21 9
redmi 2021-06-05 2021-06-21 10
redmi 2021-06-05 2021-06-21 11
redmi 2021-06-05 2021-06-21 12
redmi 2021-06-05 2021-06-21 13
redmi 2021-06-05 2021-06-21 14
redmi 2021-06-05 2021-06-21 15
redmi 2021-06-05 2021-06-21 16
redmi 2021-06-05 2021-06-21 17
redmi 2021-06-09 2021-06-15 1
redmi 2021-06-09 2021-06-15 2
redmi 2021-06-09 2021-06-15 3
redmi 2021-06-09 2021-06-15 4
redmi 2021-06-09 2021-06-15 5
redmi 2021-06-09 2021-06-15 6
redmi 2021-06-09 2021-06-15 7
redmi 2021-06-17 2021-06-26 1
redmi 2021-06-17 2021-06-26 2
redmi 2021-06-17 2021-06-26 3
redmi 2021-06-17 2021-06-26 4
redmi 2021-06-17 2021-06-26 5
redmi 2021-06-17 2021-06-26 6
redmi 2021-06-17 2021-06-26 7
redmi 2021-06-17 2021-06-26 8
redmi 2021-06-17 2021-06-26 9
redmi 2021-06-17 2021-06-26 10
huawei 2021-06-05 2021-06-26 1
huawei 2021-06-05 2021-06-26 2
huawei 2021-06-05 2021-06-26 3
huawei 2021-06-05 2021-06-26 4
huawei 2021-06-05 2021-06-26 5
huawei 2021-06-05 2021-06-26 6
huawei 2021-06-05 2021-06-26 7
huawei 2021-06-05 2021-06-26 8
huawei 2021-06-05 2021-06-26 9
huawei 2021-06-05 2021-06-26 10
huawei 2021-06-05 2021-06-26 11
huawei 2021-06-05 2021-06-26 12
huawei 2021-06-05 2021-06-26 13
huawei 2021-06-05 2021-06-26 14
huawei 2021-06-05 2021-06-26 15
huawei 2021-06-05 2021-06-26 16
huawei 2021-06-05 2021-06-26 17
huawei 2021-06-05 2021-06-26 18
huawei 2021-06-05 2021-06-26 19
huawei 2021-06-05 2021-06-26 20
huawei 2021-06-05 2021-06-26 21
huawei 2021-06-05 2021-06-26 22
huawei 2021-06-09 2021-06-15 1
huawei 2021-06-09 2021-06-15 2
huawei 2021-06-09 2021-06-15 3
huawei 2021-06-09 2021-06-15 4
huawei 2021-06-09 2021-06-15 5
huawei 2021-06-09 2021-06-15 6
huawei 2021-06-09 2021-06-15 7
huawei 2021-06-17 2021-06-21 1
huawei 2021-06-17 2021-06-21 2
huawei 2021-06-17 2021-06-21 3
huawei 2021-06-17 2021-06-21 4
huawei 2021-06-17 2021-06-21 5
Time taken: 0.161 seconds, Fetched: 108 row(s)
(2) 根据索引生成时间补齐所有时间段值
selectid,stt,edt,pos-1,date_add(stt, pos-1)
from(select id,stt,edt from brand) tmp lateral view posexplode(split(space(datediff(edt, stt)+1), '')) t as pos, val
where pos <> 0
OK
oppo 2021-06-05 2021-06-09 0 2021-06-05
oppo 2021-06-05 2021-06-09 1 2021-06-06
oppo 2021-06-05 2021-06-09 2 2021-06-07
oppo 2021-06-05 2021-06-09 3 2021-06-08
oppo 2021-06-05 2021-06-09 4 2021-06-09
oppo 2021-06-11 2021-06-21 0 2021-06-11
oppo 2021-06-11 2021-06-21 1 2021-06-12
oppo 2021-06-11 2021-06-21 2 2021-06-13
oppo 2021-06-11 2021-06-21 3 2021-06-14
oppo 2021-06-11 2021-06-21 4 2021-06-15
oppo 2021-06-11 2021-06-21 5 2021-06-16
oppo 2021-06-11 2021-06-21 6 2021-06-17
oppo 2021-06-11 2021-06-21 7 2021-06-18
oppo 2021-06-11 2021-06-21 8 2021-06-19
oppo 2021-06-11 2021-06-21 9 2021-06-20
oppo 2021-06-11 2021-06-21 10 2021-06-21
vivo 2021-06-05 2021-06-15 0 2021-06-05
vivo 2021-06-05 2021-06-15 1 2021-06-06
vivo 2021-06-05 2021-06-15 2 2021-06-07
vivo 2021-06-05 2021-06-15 3 2021-06-08
vivo 2021-06-05 2021-06-15 4 2021-06-09
vivo 2021-06-05 2021-06-15 5 2021-06-10
vivo 2021-06-05 2021-06-15 6 2021-06-11
vivo 2021-06-05 2021-06-15 7 2021-06-12
vivo 2021-06-05 2021-06-15 8 2021-06-13
vivo 2021-06-05 2021-06-15 9 2021-06-14
vivo 2021-06-05 2021-06-15 10 2021-06-15
vivo 2021-06-09 2021-06-21 0 2021-06-09
vivo 2021-06-09 2021-06-21 1 2021-06-10
vivo 2021-06-09 2021-06-21 2 2021-06-11
vivo 2021-06-09 2021-06-21 3 2021-06-12
vivo 2021-06-09 2021-06-21 4 2021-06-13
vivo 2021-06-09 2021-06-21 5 2021-06-14
vivo 2021-06-09 2021-06-21 6 2021-06-15
vivo 2021-06-09 2021-06-21 7 2021-06-16
vivo 2021-06-09 2021-06-21 8 2021-06-17
vivo 2021-06-09 2021-06-21 9 2021-06-18
vivo 2021-06-09 2021-06-21 10 2021-06-19
vivo 2021-06-09 2021-06-21 11 2021-06-20
vivo 2021-06-09 2021-06-21 12 2021-06-21
redmi 2021-06-05 2021-06-21 0 2021-06-05
redmi 2021-06-05 2021-06-21 1 2021-06-06
redmi 2021-06-05 2021-06-21 2 2021-06-07
redmi 2021-06-05 2021-06-21 3 2021-06-08
redmi 2021-06-05 2021-06-21 4 2021-06-09
redmi 2021-06-05 2021-06-21 5 2021-06-10
redmi 2021-06-05 2021-06-21 6 2021-06-11
redmi 2021-06-05 2021-06-21 7 2021-06-12
redmi 2021-06-05 2021-06-21 8 2021-06-13
redmi 2021-06-05 2021-06-21 9 2021-06-14
redmi 2021-06-05 2021-06-21 10 2021-06-15
redmi 2021-06-05 2021-06-21 11 2021-06-16
redmi 2021-06-05 2021-06-21 12 2021-06-17
redmi 2021-06-05 2021-06-21 13 2021-06-18
redmi 2021-06-05 2021-06-21 14 2021-06-19
redmi 2021-06-05 2021-06-21 15 2021-06-20
redmi 2021-06-05 2021-06-21 16 2021-06-21
redmi 2021-06-09 2021-06-15 0 2021-06-09
redmi 2021-06-09 2021-06-15 1 2021-06-10
redmi 2021-06-09 2021-06-15 2 2021-06-11
redmi 2021-06-09 2021-06-15 3 2021-06-12
redmi 2021-06-09 2021-06-15 4 2021-06-13
redmi 2021-06-09 2021-06-15 5 2021-06-14
redmi 2021-06-09 2021-06-15 6 2021-06-15
redmi 2021-06-17 2021-06-26 0 2021-06-17
redmi 2021-06-17 2021-06-26 1 2021-06-18
redmi 2021-06-17 2021-06-26 2 2021-06-19
redmi 2021-06-17 2021-06-26 3 2021-06-20
redmi 2021-06-17 2021-06-26 4 2021-06-21
redmi 2021-06-17 2021-06-26 5 2021-06-22
redmi 2021-06-17 2021-06-26 6 2021-06-23
redmi 2021-06-17 2021-06-26 7 2021-06-24
redmi 2021-06-17 2021-06-26 8 2021-06-25
redmi 2021-06-17 2021-06-26 9 2021-06-26
huawei 2021-06-05 2021-06-26 0 2021-06-05
huawei 2021-06-05 2021-06-26 1 2021-06-06
huawei 2021-06-05 2021-06-26 2 2021-06-07
huawei 2021-06-05 2021-06-26 3 2021-06-08
huawei 2021-06-05 2021-06-26 4 2021-06-09
huawei 2021-06-05 2021-06-26 5 2021-06-10
huawei 2021-06-05 2021-06-26 6 2021-06-11
huawei 2021-06-05 2021-06-26 7 2021-06-12
huawei 2021-06-05 2021-06-26 8 2021-06-13
huawei 2021-06-05 2021-06-26 9 2021-06-14
huawei 2021-06-05 2021-06-26 10 2021-06-15
huawei 2021-06-05 2021-06-26 11 2021-06-16
huawei 2021-06-05 2021-06-26 12 2021-06-17
huawei 2021-06-05 2021-06-26 13 2021-06-18
huawei 2021-06-05 2021-06-26 14 2021-06-19
huawei 2021-06-05 2021-06-26 15 2021-06-20
huawei 2021-06-05 2021-06-26 16 2021-06-21
huawei 2021-06-05 2021-06-26 17 2021-06-22
huawei 2021-06-05 2021-06-26 18 2021-06-23
huawei 2021-06-05 2021-06-26 19 2021-06-24
huawei 2021-06-05 2021-06-26 20 2021-06-25
huawei 2021-06-05 2021-06-26 21 2021-06-26
huawei 2021-06-09 2021-06-15 0 2021-06-09
huawei 2021-06-09 2021-06-15 1 2021-06-10
huawei 2021-06-09 2021-06-15 2 2021-06-11
huawei 2021-06-09 2021-06-15 3 2021-06-12
huawei 2021-06-09 2021-06-15 4 2021-06-13
huawei 2021-06-09 2021-06-15 5 2021-06-14
huawei 2021-06-09 2021-06-15 6 2021-06-15
huawei 2021-06-17 2021-06-21 0 2021-06-17
huawei 2021-06-17 2021-06-21 1 2021-06-18
huawei 2021-06-17 2021-06-21 2 2021-06-19
huawei 2021-06-17 2021-06-21 3 2021-06-20
huawei 2021-06-17 2021-06-21 4 2021-06-21
Time taken: 0.385 seconds, Fetched: 108 row(s)
(3) 去掉重复值,计算剩余点个数。
selectid,count(distinct date_add(stt, pos-1)) as day_count
from(select id,stt,edt from brand) tmp lateral view posexplode(split(space(datediff(edt, stt)+1), '')) t as pos, val
where t.pos <> 0
group by id
计算结果如下:
--------------------------------------------------------------------------------
OK
huawei 22
oppo 16
redmi 22
vivo 17
Time taken: 16.357 seconds, Fetched: 4 row(s)
这里注意很多同学对space()函数比较陌生,不知道这里的用处,其实就是为了计算结束时间和开始时间之间点的个数,用于补全数据(扩展数据),我们同样也可以使用repeat()函数来实现,split(space(datediff(edt, stt)+1), '')也可以写成split(repeat('a',datediff(edt, stt)+1), ''),由于hive的split()函数实现略坑,会多切出一个空格来,其他的split()函数实现会去掉结尾的空格,因此整体SQL代码可以优化如下:
selectid,count(distinct date_add(stt, pos-1)) as day_count
from(select id,stt,edt from brand) tmp lateral view posexplode(split(repeat('a',datediff(edt, stt)+1), 'a(?!a$)')) t as pos, val
group by id
split()函数本身就是正则的一种,这里使用'a(?!a$)'正则来匹配,其中'(?!a$)'表示正则中的断言,用于限定位置,可以理解为
if (a后面不是b) return a
?!表示非的意思,整体意思就是如果不是以a结尾的就进行匹配,实际上就是对结尾处的a不进行匹配和切割,这样产生的则刚刚好(本质上还是hive split()函数bug所导致)。
split()函数具体学习,参考链接:
(41条消息) split()之后的空格的起因_Fade Away的博客-CSDN博客
另外关于正则中断言,环视总结如下表:
左尖括号代表看左边,没有尖括号是看右边,感叹号是非的意思。
3 小 结
本题难度比较大,实际上是通过SQL来考察算法,本题得到的启示是如何来定位重叠区域的问题,针对这一问题,本题给了很好的方法,改方法也具有通用性,也可以用于解决业务中的问题,业务中经常会遇到如何合并重叠区间或时间段的问题,或找出重叠的时间段,类似的问题都可以用本题给的方法解决。本题的算法思维可以借助算导中的重叠区间定位算法来辅助分析,给以启示。
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路
SQL重叠交叉区间问题分析--HiveSQL面试题30相关推荐
- SQL Server 2005中的分析服务功能[转]
XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...
- sql server management studio性能分析_如何分析一条SQL的性能
来自公众号:谭小谭 这篇文章将给大家介绍如何使用 explain 来分析一条 sql . 网上其实已经有非常多的文章都很详细的介绍了 explain 的使用,这篇文章将实例和原理结合起来,尽量让你有更 ...
- 一起玩转SQL Server 2012 下的分析服务
转载自:https://blog.csdn.net/aspnetx/article/details/8712286 提到SQL Server 2012的分析服务,那么不得不先说下商业智能,它是一个由数 ...
- 奥威软件大数据bi_哪家BI软件能做Sql server的数据可视化分析?
用Sql server的数据做可视化分析?用奥威BI系列的BI软件吧!他们就能做Sql server的数据可视化分析,并且操作起来十分简单.就拿Sql server数据源上传来说吧!仅需一键选中.拖拉 ...
- 达梦 DM 执行SQL报字符串截断如何分析定位/超长文本截取
达梦 DM 执行SQL报字符串截断如何分析定位/超长文本截取 DM数据库报字符串截断 1 .执行INSERT时报错 一般此类问题是由于目标表存在一个(或多个)字段长度不够,导致插入失败.重点关注CHA ...
- SQL优化实战经典案例分析
前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...
- 算法会议室问题及计算重叠时间区间段
算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...
- 【数据分析/商业分析】面试题整理——统计学/机器学习/业务专题
SQL编程专题:[数据分析/商业分析]面试题整理--SQL专题 文章目录 统计学 机器学习 SQL 大数据 业务知识 python 统计学 怎么做假设检验 偏态分布怎么处理 假设检验的基本原理,为什么 ...
- sql max同一行_超经典SQL题 | 做完这4道面试题你就过关了
- 点击上方"爱数据学习社"关注我们吧! -文末领取[SQL数据分析常用语句]上篇文章→:SNA分析法是什么?KOL投放价值评估! 题目解析 | 爱数据青林 内容来源 | 爱数据学 ...
最新文章
- 神经网络其实和人一样懒惰,喜欢走捷径......
- 7.Windows线程切换_时钟中断切换
- 如何获取当日日期_Power BI时间智能函数如何处理2月29日的?
- react 引入html文件_React起手式
- C语言中printf输出特殊字符(“%d“或者“\n“)
- ubuntu-server 16.04 启用root用户的方法
- OpenShift 4 - 节点是如何通过CRI-O运行容器的
- ptaa乘以b_PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)...
- 升级到只读域控制器RODC
- pythonbreak语句的用法_详解Python中break语句的用法
- python小_Python 小入坑
- windows内核和Linux内核区别
- 起点中文网越来越火爆了,我利用Python直接把整站数据采集完毕
- Linux-两台Linux服务器间设置共享文件夹(NFS服务器)
- lottie动画android,Lottie动画简介
- ue4 rootmotion动画、模型导入使用(注)
- Pycharm打开已有项目配置python环境
- mac虚拟摄像头插件_【OBS虚拟摄像头插件下载】OBS VirtualCam(OBS虚拟摄像头插件) v2.0.5 官方最新版-开心电玩...
- 想晋升Android架构师——学习这些核心技术够用吗?
- VMware上Ubuntu实现和windows复制粘贴