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

作者:开心学大数据 时间:2024-01-22 00:09:14 

面试某某公司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 |
+------+-------+------------+------------+

最终结果应为

brandall_days
nike13
oppo12
vivo18

建表语句


-- ----------------------------
-- 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写的。

来源:https://blog.csdn.net/u012955829/article/details/102754141

标签:SQL,时间差
0
投稿

猜你喜欢

  • 浅析node命令行交互原理

    2024-05-11 10:14:36
  • python通过函数属性实现全局变量的方法

    2023-08-25 04:54:20
  • 告别网页搜索!教你用python实现一款属于自己的翻译词典软件

    2023-08-08 17:46:58
  • Windows下mysql 8.0.12 安装详细教程

    2024-01-23 23:52:36
  • Python list append方法之给列表追加元素

    2022-10-23 15:26:25
  • python计算无向图节点度的实例代码

    2022-05-24 22:42:49
  • 详解Vue项目中出现Loading chunk {n} failed问题的解决方法

    2024-04-30 10:16:03
  • python实现图像降噪

    2022-03-09 06:36:38
  • 用ASP和XMLHTTP分析远程XML文件

    2007-12-12 12:48:00
  • python小程序实现刷票功能详解

    2022-08-23 06:17:22
  • Java中@Pattern注解常用的校验正则表达式学习笔记

    2022-08-07 11:12:10
  • 将mysql转换到oracle必须了解的50件事

    2024-01-17 22:08:42
  • sql Set IDENTITY_INSERT的用法

    2024-01-14 14:27:47
  • vs10安装之后一些列问题

    2024-01-29 11:59:48
  • python提取具有某种特定字符串的行数据方法

    2022-09-20 08:12:55
  • OpenCV实现机器人对物体进行移动跟随的方法实例

    2023-04-20 08:50:49
  • Vue集成lodop插件实现打印功能

    2023-07-02 17:01:20
  • Vue日期时间选择器组件使用方法详解

    2024-05-02 16:35:27
  • python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例

    2021-12-11 14:20:36
  • python使用thrift教程的方法示例

    2022-03-14 04:29:02
  • asp之家 网络编程 m.aspxhome.com