1、题目要求

如下为平台商品促销数据: 字段为品牌,打折开始日期,打折结束日期

计算每个品牌总的打折销售天数,注意其中的交叉日期,比如 vivo 品牌,第一次活动时

间为 2021-06-05 到 2021-06-15,第二次活动时间为 2021-06-09 到 2021-06-21 其中 9 号到 15

号为重复天数,只统计一次,即 vivo 总打折天数为 2021-06-05 到 2021-06-21 共计 17 天。

brand     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

2、建表和加载数据

create table if not exists test4(
brand string,
stt string,
edt string
)row format delimited fields terminated by ";";load data local inpath '/opt/test/t4.txt' overwrite into table test4;

3、分析

1)如果没有重复的打折时间,那就直接每次打折结束时间减开始时间加一在聚合求和

但是,如下数据,存在交叉打折的情况

redmi 2021-06-05 2021-06-21
redmi 2021-06-09 2021-06-15
redmi 2021-06-17 2021-06-26

这时我们判断当前行开始时间是不是小于组内之前全部行的最大结束时间,如果小于那就将当前行的开始时间替换成之前行的最大结束时间加1(不加1就重复天了)

比如:第二行 开始时间2021-06-09 那第二行之前的最大结束时间就是2021-06-21 加1 2021-06-22第三行 开始时间2021-06-17   那第三行之前的最大结束时间就是2021-06-21 加1 2021-06-22
redmi 2021-06-05 2021-06-21  null
redmi 2021-06-09 2021-06-15 2021-06-22
redmi 2021-06-17 2021-06-26 2021-06-22然后我们在当前行的结束时间减去移下来的第四列数据,大于0就是真实的天数,小于零说明被包含了

到这整个思路就清楚了,下面就是分步骤来实现

2)将第一行到当前行的最大结束时间移到当前行作为第四列(首先数据都是按照开始时间排好序的,如果没有排好序可以自己先排序)

max(edt) over(partition by brand order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING) maxedt
select
brand,stt,edt,
max(edt) over(partition by brand order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING) maxedt
from test4;

结果:

brand     stt            edt      maxedt
huawei  2021-06-05  2021-06-26  NULL
huawei  2021-06-09  2021-06-15  2021-06-26
huawei  2021-06-17  2021-06-21  2021-06-26
oppo    2021-06-05  2021-06-09  NULL
oppo    2021-06-11  2021-06-21  2021-06-09
redmi   2021-06-05  2021-06-21  NULL
redmi   2021-06-09  2021-06-15  2021-06-21
redmi   2021-06-17  2021-06-26  2021-06-21
vivo    2021-06-05  2021-06-15  NULL
vivo    2021-06-09  2021-06-21  2021-06-15

3)相减

1、 第一个if判断maxedt是不是null,如果是null,那就当前行的(edt-stt)

2、第二个if判断maxedt是不是比stt还小,如果小,那就不存在时间交叉的情况,那也直接(edt-stt) 就好了

比如:

oppo 2021-06-05  2021-06-09  NULL
oppo    2021-06-11  2021-06-21  2021-06-09

3、只有都不是上面两种情况下,才是(edt-maxedt+1)

datediff(edt,if(maxedt is null,stt,if(maxedt>stt,date_add(maxedt,1),stt))) days
selectbrand,stt,edt,datediff(edt,if(maxedt is null,stt,if(maxedt>stt,date_add(maxedt,1),stt))) days
from (select brand,stt,edt,max(edt) over(partition by brand order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING) maxedtfrom test4
)t1;

结果:

brand    stt           edt      days
huawei  2021-06-05  2021-06-26  21
huawei  2021-06-09  2021-06-15  -12
huawei  2021-06-17  2021-06-21  -6
oppo    2021-06-05  2021-06-09  4
oppo    2021-06-11  2021-06-21  10
redmi   2021-06-05  2021-06-21  16
redmi   2021-06-09  2021-06-15  -7
redmi   2021-06-17  2021-06-26  4
vivo    2021-06-05  2021-06-15  10
vivo    2021-06-09  2021-06-21  5

4)按照品牌分组,计算每条数据加一的总和(加1和第3题相同)

select
brand,
sum(if(days>0,days+1,0)) days
from (selectbrand,stt,edt,datediff(edt,if(maxedt is null,stt,if(maxedt>stt,date_add(maxedt,1),stt))) daysfrom (select brand,stt,edt,max(edt) over(partition by brand order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING) maxedtfrom test4)t1
)t2
group by brand;

结果:

brand    days
huawei  22
oppo    16
redmi   22
vivo    17

第 4 题 打折日期交叉问题相关推荐

  1. 毕业论文设置图序号为图1-1,而不是图一-1,同时设置题注方便交叉引用

    毕业论文 图表序号 题注设置 前言 以前有进行类似的设置,但是时间久了就忘了,这里留个记录,顺便分享一下. 为实现图片序号随章节自动编号,并且可以使用[引用]模块的插入题注实现,方便后面[交叉引用], ...

  2. word2016如何插入题注并交叉引用

    word2016如何插入题注并交叉引用## 标题 在毕业论文.科研论文等写作时,为方便读者阅读,常对文中图表进行交叉引用,以便读者在阅读到"图1-2"或"表1.1&quo ...

  3. Word 2016 交叉引用 章节的题注与交叉引用

    全部更新:选中全部文档,按"F9"键更新全部交叉引用的内容. 个别更新:将光标移到要更新的交叉引用处,右击-->选择"更新域": 删除交叉引用按" ...

  4. 【秃头系列】-【本科生毕设论文格式Word】自动生成图表公式题注并交叉引用

    文章目录 01 - 论文的图.表.公式和题注 02 - 如何自动生成 2.1 - 格式约定 2.2 - 设置图的题注 2.3 - 设置表的题注 2.4 - 设置公式的题注 03 - 题注的交叉引用 3 ...

  5. Word公式编号与引用公式(详细教程)-制表符、题注、交叉引用

    如何在word里给公式编号并引用公式编号呢?主要有以下三步 添加制表符:让公式居中,编号居右.并保存为样式 插入题注:在公式后插入equation公式题注,手动加上括号和样式分隔符(Ctrl+Alt+ ...

  6. SQL--打折日期交叉问题

    如下为平台商品促销数据:字段为品牌,打折开始日期,打折结束日期 brand stt edt oppo 2021-06-05 2021-06-09 oppo 2021-06-11 2021-06-21 ...

  7. word 2016图表插入题注及交叉引用

    前言 在使用word时,会插入图片或者表格,在文中也会使用该题注,但是当删除某个图片或者新添加某个图片时,也需要相应修改文中的内容,有时非常麻烦,也会出现忘记修改的情况,导致文中内容和题注对不上号,影 ...

  8. Word 自动更新编号(插入题注、交叉引用)

    文章目录 项目说明 步骤一:插入题注 点击引用--插入题注 新建标签 将新建的标签插入 补充图片标题 步骤二:交叉引用 点击插入--交叉引用 选择引用格式 项目说明 在撰写论文时,我们一般会使用方便的 ...

  9. Word排版 题注与交叉引用实现自动编号

    目录 1 图表的编号与引用 1.1 图表自动编号 1.2 图表的引用 2 参考文献的编号与引用 2.1 参考文献自动编号 2.2 参考文献的引用 2.3 连续引用多个参考文献 (软件版本:MS Wor ...

最新文章

  1. BurpSuite日志分析过滤工具,加快SqlMap进行批量扫描的速度
  2. PspCidTable 完全解读
  3. ajax请求_重复的ajax请求让人很受伤
  4. python端口被占用_端口被占用怎么解决
  5. 2018-05-31 第二十五天
  6. Bee Framework_百度百科
  7. ROS学习(十七)安装ARDUINO IDE使用rosserial
  8. gg 修改器游戏被保护_GFX画质修改器120帧下载
  9. [沫沫金原创]Sql中跨库访问和同库跨用户访问区别
  10. SketchUp 8 Pro 安装插件 没有安装扩展程序按钮 rbz插件安装
  11. 激光雷达+imu_激光雷达——定位
  12. XYPC一款实用的平面测量控制网平差软件
  13. ESP32设备驱动-BMP180气压温度传感器驱动
  14. 茜茜:大二开始布局学习大数据,结果如何?
  15. 磁盘分区、格式化及 LVM 管理
  16. 骷髅创意设计灵感_20种创意旅行应用程序设计,激发您的灵感
  17. matlab清除所有变量,但是除了某些变量
  18. 原生js去除前后空格
  19. 如何下载外文期刊文献,怎么下载又快又省力!
  20. 服务器结构中的1U 2U 3U是什么意思

热门文章

  1. 大数据高级开发工程师——Spark学习笔记(7)
  2. java mye,Java - MyEclipse中国官方网站-技术交流论坛
  3. c语言中中文字库,读取汉字库中的汉字
  4. 快递管理系统JavaI(连接数据库)
  5. [项目]——文件搜索工具Java-Everything
  6. Linux中ibus输入法中全拼和双拼的问题+解决VNCserver切换不成功问题
  7. singleton模式 C++
  8. Android studio成品 记账本(附带文档)
  9. 【Win8自带微软输入法删除图解】
  10. 2015 移动技术白皮书