首页 >> 汽车问答 >

问1225代码问题解决方案

2026-08-26 02:34:25

答

针对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减法)即可。

 

相关阅读

最新文章