You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询未通过LeetCode温度升高测试的原因及调试方法问询

LeetCode《Rising Temperature》问题排查与调试建议

窗口函数写法未通过的原因

你的初始窗口函数写法存在两个核心问题:

  1. 窗口函数未指定排序规则:LAG(temperature) OVER() 和 LAG(recordDate) OVER() 没有在OVER()中添加ORDER BY recordDate,数据库不会默认遵循子查询的ORDER BY来执行窗口函数。这会导致LAG取到的不是按日期排序的前一行数据,而是可能按照数据存储的物理顺序或其他随机顺序取值,最终得到错误的prev_temp和day_diff。
  2. 日期减法的兼容性问题:recordDate - LAG(recordDate) OVER()这种直接对日期做减法的写法,不同数据库的处理逻辑可能不一致。比如部分数据库会返回日期的数值差,部分则可能报错,使用DATEDIFF函数才是更可靠的跨引擎写法。

另外要注意:子查询里的ORDER BY其实无效——多数SQL引擎中,子查询的排序不会影响外层查询的结果顺序,也不会影响窗口函数的执行逻辑,窗口函数的排序必须在OVER()子句中明确指定。

修正后的窗口函数写法如下:

SELECT id
FROM (
  SELECT 
    id, 
    recordDate, 
    temperature, 
    LAG(temperature) OVER(ORDER BY recordDate) AS prev_temp,
    DATEDIFF(recordDate, LAG(recordDate) OVER(ORDER BY recordDate)) AS day_diff
  FROM Weather
) w
WHERE temperature > prev_temp AND day_diff = 1

SQL查询调试方法建议

  • 分步执行查询:先单独运行子查询,查看prev_temp和day_diff的计算结果,确认每一行的前一天温度、日期差是否和预期一致,快速定位计算逻辑错误。
  • 强制窗口函数的排序规则:所有依赖顺序的窗口函数(比如LAG、LEAD、ROW_NUMBER),必须在OVER()子句中明确指定ORDER BY,不要依赖外部的排序语句。
  • 测试边界场景:专门构造特殊测试用例,比如日期不连续、存在重复日期、只有单条数据等情况,验证查询是否能正确处理这些场景。
  • 对比正确结果:把左连接正确写法的输出,和窗口函数写法的输出做对比,找出差异行,分析差异产生的原因(比如某一行的prev_temp是否取错)。
  • 使用数据库自带的日期函数:涉及日期计算时,优先用数据库提供的标准日期函数(比如DATEDIFF),避免直接对日期做算术运算,减少兼容性问题。

内容的提问来源于stack exchange,提问作者SaucyPandora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:17:02