首页 > 数据库 >sql题解--打折日期交叉问题

sql题解--打折日期交叉问题

时间:2022-12-04 17:56:56浏览次数:36  
标签:redmi 06 21 22 -- 题解 2021 sql date

题目-打折日期交叉问题

现有各品牌优惠周期表(promotion_info)如下,其记录了每个品牌的每个优惠活动的周期,其中同一品牌的不同优惠活动的周期可能会有交叉。

promotion_id brand start_date end_date
1 oppo 2021-06-05 2021-06-09
2 oppo 2021-06-11 2021-06-21
3 vivo 2021-06-05 2021-06-15

现要求统计每个品牌的优惠总天数,若某个品牌在同一天有多个优惠活动,则只按一天计算。期望结果如下:

brand (品牌) promotion_day_count (优惠天数)
vivo 17
oppo 16
redmi 22
huawei 22

思路:

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

1) 将当前行以前的数据中最大的end_date放置到当前行
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

2) 比较start_date 与 移动下来的数据, 如果开始时间大, 则不需要操作, 反之则将移动下来的数据加一替换当前行的开始时间
redmi 2021-06-05 2021-06-21
redmi 2021-06-22 2021-06-15
redmi 2021-06-22 2021-06-26

3) 将每行的结束时间减去开始时间
redmi 16
redmi -7
redmi 4

4) 按照品牌分组,计算每条数据加一后的总和
redmi 22

SELECT
	brand,
    sum(if(subdate>0,subdate+1,0)) as promotion_day_count
FROM
(
    SELECT
    brand,
    datediff(end_date,new_start_date) as subdate
    FROM
    (
        SELECT
            brand,
            start_date,
            end_date,
            if(maxedt is NULL,start_date,if(maxedt<start_date,start_date,date_add(maxedt,1))) as new_start_date
        FROM
        (
        SELECT
            brand,
            start_date,
            end_date,
            max(end_date) over(partition by brand order by start_date rows between UNBOUNDED PRECEDING and 1 PRECEDING) maxedt
            FROM promotion_info 
        )t1
    )t2
)t3
GROUP by brand

标签:redmi,06,21,22,--,题解,2021,sql,date
From: https://www.cnblogs.com/songxr/p/16950287.html

相关文章

  • MySQL知识点
    目录一、存取数据的演变史1、文本文件2、软件开发目录规范3、数据库服务(重点)1.数据库管理软件的由来①程序所有的组件就不可能运行在一台机器上②数据安全问题③并发总结......
  • 【博学谷学习记录】超强总结,用心分享|性能测试工具Jmeter的简单使用
    一、Jmeter的第一个案例需求:使用JMeter访问百度首页接口,并查看请求和响应信息操作步骤:1.启动JMeter2.在‘测试计划’下添加‘线程组’3.在‘线程组’......
  • 2.操作数据库(MySql中语句不区分大小写)
    操作数据库→操作数据库中的表→操作数据库中表的数据1.操作数据库1.创建数据库CREATEDATABASE[IFNOTEXISTS]westos--[]代表可选的,写不写都行2.删除数据库DRO......
  • 第十周内容回顾(包含部分数据库)
    目录python操作MySQLSQL注入问题视图触发器事务存储过程函数索引的相关概念索引数据结构慢查询优化前端之HTMLHTTP协议HTML概览head内常见标签body内基本标签常见符号body......
  • 让Visual Leak Detector使用最新10.0版本的dbghelp.dll
    让VisualLeakDetector使用最新10.0版本的dbghelp.dll介绍VLD(VisualLeakDetector)是一个检测WindowsC++程序内存泄漏的老牌神器,但好几年没维护了。网址:https://github......
  • Linux使用 RPM 安装 Kibana
    参考地址:https://www.elastic.co/guide/en/kibana/8.5/rpm.html#rpm-repo1.下载并安装公共签名密钥rpm--importhttps://artifacts.elastic.co/GPG-KEY-elasticsearch......
  • Golang抢占式调度
    Golang抢占式调度在1.12版本之前,go的调度器不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,会引发一些问题,如某些Goroutine可以长时间占用线程,造成......
  • vba-获取某一个sheet某一列最大行
    FunctiongetLastRow(ByValsheetNameAsWorksheet,ByValcolumnNameAsString)AsLongDimmaxRowAsLongIfRight(rptfile,3)="xls"Thenmax......
  • podman 安装 MySQL8
    如何在测试环境下,快速创建一个MySQL环境呢?容器化是个不错的选择。拉取MySQL镜像[root@node11~]#podmanpullmysql✔docker.io/library/mysql:latestTryingtopu......
  • EBS: 编译科目:APP-FND-00668: 用于在此字段中定义弹性域的数据可能不一致
    编译科目提示错误。 APP-FND-00668: 用于在此字段中定义弹性域的数据可能不一致。请通知您的系统管理员,函数: FDFRKS 无法找到应用产品 = &APPL, 代码 = GL# 以......