目 录

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相关推荐

  1. SQL Server 2005中的分析服务功能[转]

    XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...

  2. sql server management studio性能分析_如何分析一条SQL的性能

    来自公众号:谭小谭 这篇文章将给大家介绍如何使用 explain 来分析一条 sql . 网上其实已经有非常多的文章都很详细的介绍了 explain 的使用,这篇文章将实例和原理结合起来,尽量让你有更 ...

  3. 一起玩转SQL Server 2012 下的分析服务

    转载自:https://blog.csdn.net/aspnetx/article/details/8712286 提到SQL Server 2012的分析服务,那么不得不先说下商业智能,它是一个由数 ...

  4. 奥威软件大数据bi_哪家BI软件能做Sql server的数据可视化分析?

    用Sql server的数据做可视化分析?用奥威BI系列的BI软件吧!他们就能做Sql server的数据可视化分析,并且操作起来十分简单.就拿Sql server数据源上传来说吧!仅需一键选中.拖拉 ...

  5. 达梦 DM 执行SQL报字符串截断如何分析定位/超长文本截取

    达梦 DM 执行SQL报字符串截断如何分析定位/超长文本截取 DM数据库报字符串截断 1 .执行INSERT时报错 一般此类问题是由于目标表存在一个(或多个)字段长度不够,导致插入失败.重点关注CHA ...

  6. SQL优化实战经典案例分析

    前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...

  7. 算法会议室问题及计算重叠时间区间段

    算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...

  8. 【数据分析/商业分析】面试题整理——统计学/机器学习/业务专题

    SQL编程专题:[数据分析/商业分析]面试题整理--SQL专题 文章目录 统计学 机器学习 SQL 大数据 业务知识 python 统计学 怎么做假设检验 偏态分布怎么处理 假设检验的基本原理,为什么 ...

  9. sql max同一行_超经典SQL题 | 做完这4道面试题你就过关了

    - 点击上方"爱数据学习社"关注我们吧! -文末领取[SQL数据分析常用语句]上篇文章→:SNA分析法是什么?KOL投放价值评估! 题目解析 | 爱数据青林 内容来源 | 爱数据学 ...

最新文章

  1. 神经网络其实和人一样懒惰,喜欢走捷径......
  2. 7.Windows线程切换_时钟中断切换
  3. 如何获取当日日期_Power BI时间智能函数如何处理2月29日的?
  4. react 引入html文件_React起手式
  5. C语言中printf输出特殊字符(“%d“或者“\n“)
  6. ubuntu-server 16.04 启用root用户的方法
  7. OpenShift 4 - 节点是如何通过CRI-O运行容器的
  8. ptaa乘以b_PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)...
  9. 升级到只读域控制器RODC
  10. pythonbreak语句的用法_详解Python中break语句的用法
  11. python小_Python 小入坑
  12. windows内核和Linux内核区别
  13. 起点中文网越来越火爆了,我利用Python直接把整站数据采集完毕
  14. Linux-两台Linux服务器间设置共享文件夹(NFS服务器)
  15. lottie动画android,Lottie动画简介
  16. ue4 rootmotion动画、模型导入使用(注)
  17. Pycharm打开已有项目配置python环境
  18. mac虚拟摄像头插件_【OBS虚拟摄像头插件下载】OBS VirtualCam(OBS虚拟摄像头插件) v2.0.5 官方最新版-开心电玩...
  19. 想晋升Android架构师——学习这些核心技术够用吗?
  20. VMware上Ubuntu实现和windows复制粘贴

热门文章

  1. 郑强教授相关语录(转)
  2. 云原生 SQL 数据库 CockroachDB 2.0 发布:性能极大提升
  3. 沁恒微电子CH9120是一款网络串口透传芯片
  4. 9子空间的投影和Ax=b
  5. 案例,使用封装实现电子宠物系统的企鹅类正确输入健康值和亲密度
  6. HTML——背景属性
  7. python卡尔曼滤波室内定位_基于核函数与卡尔曼滤波的室内定位方法
  8. 重启计算机设的桌面背景就没了,电脑重启后壁纸消失如何解决
  9. 设计模式基于C#的实现与扩展——创建型模式(三)
  10. hive基本概念原理与底层架构