专栏首页SQL实现SQL 统计实际的活动天数

SQL 统计实际的活动天数

有一张促销活动表 promotion,它记录了各品牌进行促销活动的开始时间和结束时间,同一个品牌在某段时间内可能会参与多次促销活动,即同一个品牌的活动时间范围可能会重叠。为了减少干扰,我们只保留了 brand、start_date、end_date 这几个字段。promotion 现有的记录如下:

brand   start_date  end_date    
------  ----------  ------------
A       2018-09-01  2018-09-05  
A       2018-09-03  2018-09-06  
A       2018-09-09  2018-09-15  
B       2018-08-04  2018-08-15  
B       2018-08-04  2018-08-05  
C       2018-08-15  2018-08-21  
C       2018-09-02  2018-09-12  

要求:统计各个品牌实际举行促销活动的天数,重叠的日期仅计算一次。 比如品牌A,在 2018-09-01 ~ 2018-09-05 和 2018-09-03 ~ 2018-09-06 这段时间内总共做了两次活动,不过在 2018-09-03 ~ 2018-09-05 这段时间内出现了重叠,所以品牌A 在 2018-09-01 ~ 2018-09-06 这段里总共做了 6 天的活动。

最终输出的结果:

brand      days  
------  --------
A             13
B             12
C             18

思路:枚举出各品牌举行促销活动的所有日期,再根据品牌分组统计不重复日期的活动天数。

大致有两种方式实现日期的枚举,一种是使用递归,另外一种是借助数字辅助表。

递归方式的实现脚本:

WITH recursive t0 (brand, start_date, end_date) AS 
(SELECT 
  brand,
  start_date,
  end_date 
FROM
  promotion 
UNION ALL 
SELECT 
  brand,
  DATE_ADD(start_date, INTERVAL 1 DAY) AS start_date,
  end_date 
FROM
  t0 
WHERE start_date < end_date) 
SELECT 
  brand,
  COUNT(DISTINCT start_date) AS days 
FROM
  t0 
GROUP BY brand 

digit 是数字辅助表,它只有一个字段 id,digit 存储了从 1 ~ 1000 的自然数。

借助数字辅助表的实现脚本:

WITH t0 AS 
(SELECT 
  brand,
  start_date,
  end_date,
  DATE_ADD(start_date, INTERVAL d.id - 1 DAY) AS p_date 
FROM
  promotion p,
  digit d 
WHERE d.id <= DATEDIFF(p.end_date, p.start_date) + 1) 
SELECT 
  brand,
  COUNT(DISTINCT p_date) AS days 
FROM
  t0 
GROUP BY brand 

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原 收集SQL语句统计每天、每月、每年的数

    霡霂
  • Oracle自动性能统计

      高效诊断性能问题,需要提供完整可用的统计信息,好比医生给病人看病的望闻问切,才能够正确的确诊,然后再开出相应的药方。Oracle数据库为系统、会话以及单独的...

    Leshami
  • 博客统计代码中的动态运行天数

    沈唁
  • 产品经理需要会 SQL 吗?会 SQL 对产品有多大帮助?

    1.当我们要查数据时,技术人手不够,永远在排期。不如要了只读权限自己干,取数分析一条龙。

    蒋川
  • 群众吃一个瓜,可能就有一堆DBA要掉头发

    前阵的微博热搜,各种大瓜接踵而来,数据君就像一个瓜田里的猹。 最魔幻的当数22号,前有弃养上热门,后来北京网易员工核酸检测阳性又上热搜,全员下班,隔壁的新浪员...

    腾讯云数据库 TencentDB
  • “提需求的”与“拉SQL的”如何有效沟通

    这个题目改了又改,最终还是感觉这样写更具有可读性,毕竟一篇文章最终还是以能够读懂为初衷的,现阶段,各个公司里科技开发、数据编制成为必不可少的岗位,技术和业务的沟...

    Python数据科学
  • 数据库漫谈(七)

    本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师 ,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db...

    SQLplusDB
  • 宜信开源|案例:UAVStack的慢SQL数据库监控实战

    在此前的「UAVStack的慢SQL数据库监控功能及其实现」一文中,我们提到,数据库连接池监控能够让运维人员随时了解数据库连接池的状态,有效防止系统出现连接池活...

    宜信技术学院
  • 另辟蹊径第二弹,时间规律里的秘密

    墨墨导读:在上个月的数据技术嘉年华里,我做了名为《另辟蹊径:从其他角度去解决数据库问题》的案例分享,讲述了通过时间规律来解决系统故障的思路。结果,这两天又出了类...

    数据和云
  • MyBatis-从查询昨天的数据说起

    前段时间写了《RabbitMQ入门》系列 RabbitMQ入门-初识RabbitMQ RabbitMQ入门-从HelloWorld开始 RabbitMQ入门-高...

    JackieZheng
  • 一条SQL能占多大内存?

    初学计算机时,我经常琢磨的一个问题是:一个进程到底能吃多大内存,能把系统内存吃完?

    Lenis
  • MySQL如何按天统计数据,没有记录的天自动补充0

    1. 通过该语句可以实现指定日期到当前日期的日期列表数据,并用0填充要统计的sum字段

    兜兜毛毛
  • 分享博客统计中的动态运行天数代码

    快到博主恋爱纪念日了,本来是打算做一个恋爱时间统计功能来小小的罗曼蒂克一下,类似于 已相恋 **年 **天 **小时 **分 **秒,当我找到让时间差转成年月日...

    张戈
  • mysql如何进行累加计算

    接了一个需求,产品想分析一下用户增长的曲线。也就是某个时间段的每日总人数列表。好对近期活动进行一个效果的评测。这个统计sql还是花了我一小段时间的。mysql统...

    码农小胖哥
  • python数据处理实战-自动统计mysql数据库数据表每天数据量

    日常报表统计,日总量,日增量不可避免,这篇文章我们从实际应用出发,从逻辑思考到最后写出代码,一步步分析拆解 一.表结构设计 既然想统计每一张表每天的数据量,后续...

    企鹅号小编
  • 从大数据技术变迁猜一猜AI人工智能的发展

    目前大数据已经成为了各家互联网公司的核心资产和竞争力了,其实不仅是互联网公司,包括传统企业也拥有大量的数据,也想把这些数据发挥出作用。在这种环境下,大数据技术的...

    奎哥
  • 【DB笔试面试819】在Oracle中,什么是AWR?

    ASH(Active Session History,活动会话历史信息)、AWR(Automatic Workload Repository,自动负载信息库)、...

    小麦苗DBA宝典
  • 一个执行计划异常变更的案例 - 外传之SQL Profile(上)

    之前的几篇文章: 《一个执行计划异常变更的案例 - 前传》 《一个执行计划异常变更的案例 - 外传之绑定变量窥探》 《一个执行计划异常变更的案例 -...

    bisal
  • 金融策略数据分析师:我是如何从萌新进化为职场老司机的

    从我去年入职金融策略数据分析师到如今,已有半年时间了。通过这半年的工作锻炼,我已经从刚入职的啥也不懂的萌新,进化成了如今工作清单一大堆的职场老司机,这个转变的过...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券