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 |
+------+-------+------------+------------+
最终结果应为
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写的。
来源:https://blog.csdn.net/u012955829/article/details/102754141
标签:SQL,时间差
0
投稿
猜你喜欢
Python变量和字符串详解
2023-08-23 02:59:49
python数据写入Excel文件中的实现步骤
2023-11-19 23:11:45
python+ffmpeg视频并发直播压力测试
2023-09-02 10:30:33
python调试模式无响应解决案例
2021-03-27 00:23:18
Python词云的正确实现方法实例
2021-08-05 10:53:41
adonet基础示例分享(adonet连接数据库)
2024-01-15 23:15:44
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2021-09-15 16:28:22
基于SQL中的数据查询语句汇总
2024-01-28 07:06:09
SQL窗口函数之排名窗口函数的使用
2024-01-26 18:49:31
js实现鼠标切换图片(无定时器)
2023-09-07 02:44:58
整理Python中常用的conda命令操作
2022-07-17 16:53:33
Python 如何将integer转化为罗马数(3999以内)
2023-01-19 12:46:51
Ceph集群CephFS文件存储核心概念及部署使用详解
2023-04-18 02:23:31
Python3 pywin32模块安装的详细步骤
2023-01-20 06:42:46
让程序员都费解的10大编程语言特性
2023-09-12 03:56:49
如何利用Python处理excel表格中的数据
2022-10-27 03:32:38
SQL Server代理服务无法启动怎么办
2024-01-13 20:27:03
Python中用Ctrl+C终止多线程程序的问题解决
2021-10-22 03:22:18
Python绘图之turtle库的基础语法使用
2023-04-09 18:39:16
PHP PDOStatement::nextRowset讲解
2023-06-06 07:18:28