• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL面试题:求时间差之和(有重复不计)

    面试某某公司BI岗位的时候,面试题中的一道sql题,咋看一下很简单,写的时候发现自己缺乏总结,没有很快的写出来。

    题目如下:

    求每个品牌的促销天数

    表sale为促销营销表,数据中存在日期重复的情况,例如id为1的end_date为20180905,id为2的start_date为20180903,即id为1和id为2的存在重复的销售日期,求出每个品牌的促销天数(重复不算)

    表结果如下:

    +------+-------+------------+------------+
    | id | brand | start_date | end_date |
    +------+-------+------------+------------+
    | 1 | nike | 2018-09-01 | 2018-09-05 |
    | 2 | nike | 2018-09-03 | 2018-09-06 |
    | 3 | nike | 2018-09-09 | 2018-09-15 |
    | 4 | oppo | 2018-08-04 | 2018-08-05 |
    | 5 | oppo | 2018-08-04 | 2018-08-15 |
    | 6 | vivo | 2018-08-15 | 2018-08-21 |
    | 7 | vivo | 2018-09-02 | 2018-09-12 |
    +------+-------+------------+------------+
    

    最终结果应为

    brand all_days
    nike 13
    oppo 12
    vivo 18

    建表语句

    -- ----------------------------
    -- Table structure for sale
    -- ----------------------------
    DROP TABLE IF EXISTS `sale`;
    CREATE TABLE `sale` (
     `id` int(11) DEFAULT NULL,
     `brand` varchar(255) DEFAULT NULL,
     `start_date` date DEFAULT NULL,
     `end_date` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of sale
    -- ----------------------------
    INSERT INTO `sale` VALUES (1, 'nike', '2018-09-01', '2018-09-05');
    INSERT INTO `sale` VALUES (2, 'nike', '2018-09-03', '2018-09-06');
    INSERT INTO `sale` VALUES (3, 'nike', '2018-09-09', '2018-09-15');
    INSERT INTO `sale` VALUES (4, 'oppo', '2018-08-04', '2018-08-05');
    INSERT INTO `sale` VALUES (5, 'oppo', '2018-08-04', '2018-08-15');
    INSERT INTO `sale` VALUES (6, 'vivo', '2018-08-15', '2018-08-21');
    INSERT INTO `sale` VALUES (7, 'vivo', '2018-09-02', '2018-09-12');
    
    

    方式1:

    利用自关联下一条记录的方法

    select brand,sum(end_date-befor_date+1) all_days from 
     (
     select s.id ,
      s.brand ,
      s.start_date ,
      s.end_date , 
      if(s.start_date>=ifnull(t.end_date,s.start_date) ,s.start_date,DATE_ADD(t.end_date,interval 1 day) ) as befor_date
     from sale s left join (select id+1 as id ,brand,end_date from sale) t on s.id = t.id and s.brand = t.brand
     order by s.id
     )tmp
     group by brand

    运行结果

    +-------+---------+
    | brand | all_day |
    +-------+---------+
    | nike |  13 |
    | oppo |  12 |
    | vivo |  18 |
    +-------+---------+

    该方法对本题中的表格有效,但对于有id不连续的品牌的记录时不一定适用。

    方式2:

    SELECT a.brand,SUM(
     CASE 
      WHEN a.start_date=b.start_date AND a.end_date=b.end_date
      AND NOT EXISTS(
      SELECT *
      FROM sale c LEFT JOIN sale d ON c.brand=d.brand 
       WHERE d.brand=a.brand
       AND c.start_date=a.start_date
       AND c.id>d.id 
       AND (d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date>c.end_date
       OR 
      c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date>d.end_date)
        ) 
       THEN (a.end_date-a.start_date+1) 
      WHEN (a.id>b.id AND b.start_date BETWEEN a.start_date AND a.end_date AND b.end_date>a.end_date ) THEN (b.end_date-a.start_date+1)
      ELSE 0 END
      ) AS all_days 
    FROM sale a JOIN sale b ON a.brand=b.brand GROUP BY a.brand
    

    运行结果

    +-------+----------+
    | brand | all_days |
    +-------+----------+
    | nike |  13 |
    | oppo |  12 |
    | vivo |  18 |
    +-------+----------+

    其中条件

    d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date>c.end_date
       OR 
    c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date>d.end_date

    可以换成

    c.start_date  d.end_date AND (c.end_date > d.start_date)

    结果同样正确

    用分析函数同样可行的,自己电脑暂时没装oracle,用的mysql写的。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 在php和MySql中计算时间差的方法详解
    • mysql计算时间差函数
    • 在php和MySql中计算时间差的方法
    上一篇:CentOS7.6安装MYSQL8.0的步骤详解
    下一篇:浅析CentOS6.8安装MySQL8.0.18的教程(RPM方式)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL面试题:求时间差之和(有重复不计) SQL,面,试题,求,时间差,之和,