针对LeetCode 1225题“报告系统状态的连续日期”,核心解法是使用窗口函数(如ROW_NUMBER)配合日期差值分组,将连续相同状态的日期合并为区间。具体SQL如下(以MySQL为例):
```sql
SELECT
period_state,
MIN(date) AS start_date,
MAX(date) AS end_date
FROM (
SELECT
date,
status,
period_state,
DATE_SUB(date, INTERVAL ROW_NUMBER() OVER (PARTITION BY period_state ORDER BY date) DAY) AS grp
FROM (
SELECT
fail_date AS date,
'failed' AS status,
'failed' AS period_state
FROM Failed
WHERE fail_date BETWEEN '2019-01-01' AND '2019-12-31'
UNION ALL
SELECT
success_date,
'succeeded' AS status,
'succeeded' AS period_state
FROM Succeeded
WHERE success_date BETWEEN '2019-01-01' AND '2019-12-31'
) t
) t2
GROUP BY period_state, grp
ORDER BY start_date;
```
此解法将失败和成功状态统一处理,通过连续日期分组提取每个区间的起止日期。若需处理其他数据库(如SQL Server),可改用DENSE_RANK或自连接方式。
【常见问题】
问题1:1225代码在MySQL中运行时出现语法错误,如何解决?
回答1:请检查MySQL版本是否支持窗口函数(需8.0+),若版本较低,可使用变量或自连接替代,例如:`SELECT period_state, MIN(date) start_date, MAX(date) end_date FROM (SELECT date, period_state, @grp := IF(@prev_state = period_state AND DATEDIFF(date, @prev_date) = 1, @grp, @grp + 1) AS grp, @prev_state := period_state, @prev_date := date FROM (SELECT ...) t1, (SELECT @grp := 0, @prev_state := '', @prev_date := NULL) vars ORDER BY date) t2 GROUP BY period_state, grp;`。
问题2:1225代码的查询结果中日期顺序混乱怎么办?
回答2:确保外层ORDER BY start_date按升序排列,并且内层子查询的UNION ALL中两个数据集的排序不影响最终结果。若仍有问题,检查日期字段是否为DATE类型,避免隐式转换导致排序异常。
问题3:1225代码能处理跨年数据吗?
回答3:原题限定日期范围在2019年内,若需处理跨年数据,只需移除WHERE子句中的年份限制,并注意窗口函数中日期差值的计算(如使用DATEDIFF而非INTERVAL减法)即可。


