题目描述
(通过次数6,121 | 提交次数11,246,通过率54.43%)
Table: Failed +--------------+---------+ | Column Name | Type | +--------------+---------+ | fail_date | date | +--------------+---------+ 该表主键为 fail_date。 该表包含失败任务的天数. Table: Succeeded +--------------+---------+ | Column Name | Type | +--------------+---------+ | success_date | date | +--------------+---------+ 该表主键为 success_date。 该表包含成功任务的天数. 系统 每天 运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。 编写一个 SQL 查询2019-01-01到2019-12-31 期间任务连续同状态period_state的起止日期(start_date 和 end_date)。即如果任务失败了,就是失败状态的起止日期,如果任务成功了,就是成功状态的起止日期。 最后结果按照起始日期start_date排序 查询结果样例如下所示: Failed table: +-------------------+ | fail_date | +-------------------+ | 2018-12-28 | | 2018-12-29 | | 2019-01-04 | | 2019-01-05 | +-------------------+ Succeeded table: +-------------------+ | success_date | +-------------------+ | 2018-12-30 | | 2018-12-31 | | 2019-01-01 | | 2019-01-02 | | 2019-01-03 | | 2019-01-06 | +-------------------+ Result table: +--------------+--------------+--------------+ | period_state | start_date | end_date | +--------------+--------------+--------------+ | succeeded | 2019-01-01 | 2019-01-03 | | failed | 2019-01-04 | 2019-01-05 | | succeeded | 2019-01-06 | 2019-01-06 | +--------------+--------------+--------------+ 结果忽略了 2018 年的记录,因为我们只关心从 2019-01-01 到 2019-12-31 的记录 从 2019-01-01 到 2019-01-03 所有任务成功,系统状态为 "succeeded"。 从 2019-01-04 到 2019-01-05 所有任务失败,系统状态为 "failed"。 从 2019-01-06 到 2019-01-06 所有任务成功,系统状态为 "succeeded"。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/report-contiguous-dates
//测试数据 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); insert into Failed (fail_date) values ('2018-12-28'); insert into Failed (fail_date) values ('2018-12-29'); insert into Failed (fail_date) values ('2019-01-04'); insert into Failed (fail_date) values ('2019-01-05'); insert into Succeeded (success_date) values ('2018-12-30'); insert into Succeeded (success_date) values ('2018-12-31'); insert into Succeeded (success_date) values ('2019-01-01'); insert into Succeeded (success_date) values ('2019-01-02'); insert into Succeeded (success_date) values ('2019-01-03'); insert into Succeeded (success_date) values ('2019-01-06');
解题思路
跟公众号昨天的推文一样,这又是一道求连续区间的题目。
具体到这道题,需要分别计算成功的区间和失败的区间。
那么,在计算时,是可以分开独立计算的。但SQL写起来相对繁琐。
实际上,成功和失败的数据集合并后,再统一计算,也是可以的。只是需要将成功或失败的状态,作为一个维度参与分组。这样成功和失败的两组,就可以实现独立计算。
下面的参考SQL仍然使用的是连续区间的第三个特性实现的。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select period_state, min(dt) start_date, max(dt) end_date from ( select period_state, dt, subdate(dt,row_number() over(partition by period_state order by dt)) dt_sub from ( select 'succeeded' period_state,success_date dt from Succeeded where success_date between '2019-01-01' and '2019-12-31' union all select 'failed' period_state,fail_date dt from Failed where fail_date between '2019-01-01' and '2019-12-31' )b )a group by period_state,dt_sub order by min(dt);
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。