当前位置: 首页 > wzjs >正文

做导航网站用多大的空间郑州网站优化

做导航网站用多大的空间,郑州网站优化,昆明网站建设猫咪,假视频网站源码出售文章目录 概述题目:交叉打折问题求解题解第一步:使用滑动窗口统计当前活动前的最大结束日期步骤二:拆分出交叉部分步骤三:计算每次活动的持续天数步骤四:分组统计最终结果完整SQL 概述 最近刷题时遇到一些比较有意思的…

文章目录

  • 概述
  • 题目:交叉打折问题求解
  • 题解
    • 第一步:使用滑动窗口统计当前活动前的最大结束日期
    • 步骤二:拆分出交叉部分
    • 步骤三:计算每次活动的持续天数
    • 步骤四:分组统计最终结果
    • 完整SQL

概述

最近刷题时遇到一些比较有意思的题目,就决定记录下来,并将解题过程一一拆解。此文中要记录的是交叉打折日期问题的求解。

题目:交叉打折问题求解

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

表logs

字段名数据类型
brandstring
sttdate
edtdate

示例数据如下:

brandsttedt
oppo2021-06-052021-06-09
oppo2021-06-112021-06-21
vivo2021-06-052021-06-15
vivo2021-06-092021-06-21
redmi2021-06-052021-06-21
redmi2021-06-092021-06-15
redmi2021-06-172021-06-26
huawei2021-06-052021-06-26
huawei2021-06-092021-06-15
huawei2021-06-172021-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 天。

题解

碰到这类问题,我们第一反应就是需要使用窗口处理函数,解题思路如下所示:

  • 第一步统计出当前活动前的最大结束日期,按照品牌brand进行分区,然后按照stt、edt字段升序进行处理,并使用滑动窗口统计出窗口中到当前行之前的最大的结束日期,使用MAX(edt) OVER(PARTITION BY brand ORDER BY stt ASC, edt ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING )

  • 第二步:拆分出交叉部分,通过比较当前行的开始日期stt和上一步骤中统计出来的当前行之前的最大结束日期prev_max_edt的大小:

    • 如果当前活动的开始日期比之前的最大的结束日期大,则说明两次活动之间没有交叉;

    • 如果当前活动的开始日期比之前活动最大结束日期小,则说明二者具有交叉,那么这次活动的开始日期要重置为上一次最大日期的后一天,这样在计算活动时长时才不会有交叉

  • 第三步:计算每次活动的持续天数,在第二步将每次活动都处理成了没有交叉日期的数据之后,就可以利用结束日期减去开始日期,统计出每次活动的持续时长。在这一步的处理结果中可能会得到负数,这表示这次活动的结束日期比“开始日期”小,这说明当前活动被包含在了上一次活动期间。

  • 第四步:分组统计最后结果,第三步中已经得出了每次活动的持续时长,最后就只需要按照分组统计,将每个品牌的活动时长相加即可。需要注意的是,如果活动的时长为负数(第三步已解释),则不参与计算

第一步:使用滑动窗口统计当前活动前的最大结束日期

WITH temp_001 AS (SELECT brand,stt,edt,MAX(edt) OVER(PARTITION BY brand ORDER BY stt,edt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS prev_max_edtFROM logs
)

输出如下:

brandsttedtprev_max_edt
oppo2021-06-052021-06-09NULL
oppo2021-06-112021-06-212021-06-09
vivo2021-06-052021-06-15NULL
vivo2021-06-092021-06-212021-06-15
redmi2021-06-052021-06-21NULL
redmi2021-06-092021-06-152021-06-21
redmi2021-06-172021-06-262021-06-21
huawei2021-06-052021-06-26NULL
huawei2021-06-092021-06-152021-06-26
huawei2021-06-172021-06-212021-06-26

步骤二:拆分出交叉部分

通过比较当前行的开始日期stt和上一步骤中统计出来的当前行之前的最大结束日期prev_max_edt的大小:

  • 如果当前活动的开始日期比之前的最大的结束日期大,则说明两次活动之间没有交叉;

  • 如果当前活动的开始日期比之前活动最大结束日期小,则说明二者具有交叉,那么这次活动的开始日期要重置为上一次最大日期的后一天,这样在计算活动时长时才不会有交叉

SQL实现:

temp_002 AS (SELECT brand, IF(prev_max_dt IS NULL, stt, IF(stt>prev_max_dt, stt, DATE_ADD(max_edt, INTERVAL 1 DAY ))) AS stt, edtFROM temp_001
)

输出结果:

brandsttedt
oppo2021-06-052021-06-09
oppo2021-06-112021-06-21
vivo2021-06-052021-06-15
vivo2021-06-162021-06-21
redmi2021-06-052021-06-21
redmi2021-06-222021-06-15
redmi2021-06-222021-06-26
huawei2021-06-052021-06-26
huawei2021-06-272021-06-15
huawei2021-06-272021-06-21

步骤三:计算每次活动的持续天数

temp_003 AS (SELECT brand,stt,edt,DATE_DIFF(edt,stt) AS daysFROM temp_002
)

输出结果

brandsttedtdays
oppo2021-06-052021-06-094
oppo2021-06-112021-06-2110
vivo2021-06-052021-06-1510
vivo2021-06-162021-06-215
redmi2021-06-052021-06-2116
redmi2021-06-222021-06-15-7
redmi2021-06-222021-06-264
huawei2021-06-052021-06-2621
huawei2021-06-272021-06-15-12
huawei2021-06-272021-06-21-6

步骤四:分组统计最终结果

SELECT brand,SUM(IF(days>0, days, 0 )) AS ttl_days
FROM temp_003
GROUP BY brand
;

输出结果

brandttl_days
huawei21
oppo14
redmi20
vivo15

完整SQL

WITH temp_001 AS (SELECT brand,stt,edt,MAX(edt) OVER(PARTITION BY brand ORDER BY stt,edt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS prev_max_edtFROM logs
)
,temp_002 AS (SELECT brand, IF(prev_max_dt IS NULL, stt, IF(stt>prev_max_dt, stt, DATE_ADD(max_edt, INTERVAL 1 DAY ))) AS stt, edtFROM temp_001
)
,temp_003 AS (SELECT brand,stt,edt,DATE_DIFF(edt,stt) AS daysFROM temp_002
)
SELECT brand,SUM(IF(days>0, days, 0 )) AS ttl_days
FROM temp_003
GROUP BY brand
;
http://www.dtcms.com/wzjs/111641.html

相关文章:

  • 邯郸做移动网站哪儿好爱站网长尾词挖掘工具
  • 网站开发做美工自己搜20条优化措施
  • 网站建设属于什么岗位网络营销外包网络推广
  • 企业展示型网站有哪些c盘优化大师
  • 广告公司企业介绍宁波seo网站
  • 深圳网站建设分期付网站seo排名优化
  • 网站建设制作设计营销公司杭州东莞疫情最新消息
  • 需要大量做网站做推广的行业福州百度推广优化排名
  • 哪里有网站可以做动态视频倒计时网络舆情分析
  • 哪家网站做民宿好免费友情链接网
  • 泉州网站建设推广企业怎么免费创建个人网站
  • 做网站需要独立ip吗三只松鼠营销案例分析
  • 襄阳建设网站微信广告投放收费标准
  • 凉州区住房和城乡建设局网站广州日新增51万人
  • 附近的电脑培训班在哪里成都排名seo公司
  • 宁波网站排名优化费用qq推广工具
  • 大学生网站建设申报书seo排名优化公司价格
  • 渭南网站建设服务武汉千锋教育培训机构怎么样
  • 邢台做网站流程优化营商环境心得体会2023
  • 基础网站怎么做seo优化的方法有哪些
  • 承德网站设计公司html网页完整代码作业
  • 好创意设计大赛官网seo全称是什么意思
  • 把收藏夹网站设置成主业怎么做确认已有81人感染
  • 百度网站空间怎么弄一个网站
  • 免费网站申请域名39939cn整站排名优化品牌
  • 网站开发培训成都宁波受欢迎全网seo优化
  • 织梦网站在css中怎样做导航栏百度识图搜索
  • 合肥市城乡建设局和住建局官网网站seo推广优化
  • 网站建设资讯平台网上教育培训机构
  • 网站 蜘蛛查网址