# Write your MySQL query statement below
1225. 报告系统状态的连续日期
表:Failed
+--------------+---------+ | Column Name | Type | +--------------+---------+ | fail_date | date | +--------------+---------+ 该表主键为 fail_date (具有唯一值的列)。 该表包含失败任务的天数.
表: Succeeded
+--------------+---------+ | Column Name | Type | +--------------+---------+ | success_date | date | +--------------+---------+ 该表主键为 success_date (具有唯一值的列)。 该表包含成功任务的天数.
系统 每天 运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。
编写解决方案找出 2019-01-01 到 2019-12-31 期间任务连续同状态 period_state
的起止日期(start_date
和 end_date
)。即如果任务失败了,就是失败状态的起止日期,如果任务成功了,就是成功状态的起止日期。
最后结果按照起始日期 start_date
排序
返回结果样例如下所示:
示例 1:
输入: 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 | +-------------------+ 输出: +--------------+--------------+--------------+ | 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"。
原站题解
mysql 解法, 执行用时: 704 ms, 内存消耗: 0 B, 提交时间: 2023-10-15 23:07:32
select type as period_state, min(date) as start_date, max(date) as end_date from ( select type, date, subdate(date,row_number()over(partition by type order by date)) as diff from ( select 'failed' as type, fail_date as date from Failed union all select 'succeeded' as type, success_date as date from Succeeded ) a )a where date between '2019-01-01' and '2019-12-31' group by type,diff order by start_date
mysql 解法, 执行用时: 903 ms, 内存消耗: 0 B, 提交时间: 2023-10-15 23:07:16
SELECT period_state, MIN(date) as start_date, MAX(date) as end_date FROM ( SELECT success_date AS date, "succeeded" AS period_state, IF(DATEDIFF(@pre_date, @pre_date := success_date) = -1, @id, @id := @id+1) AS id FROM Succeeded, (SELECT @id := 0, @pre_date := NULL) AS temp UNION SELECT fail_date AS date, "failed" AS period_state, IF(DATEDIFF(@pre_date, @pre_date := fail_date) = -1, @id, @id := @id+1) AS id FROM Failed, (SELECT @id := 0, @pre_date := NULL) AS temp ) T WHERE date BETWEEN "2019-01-01" AND "2019-12-31" GROUP BY T.id ORDER BY start_date ASC