关注
文末的名片达文汐
,回复关键词“力扣源码”,即可获取完整源码!!详见:源码和核心代码的区别
题目详情
表: Weather
Column Name | Type |
---|---|
id | int |
recordDate | date |
temperature | int |
id
是该表具有唯一值的列。- 没有具有相同
recordDate
的不同行。 - 该表包含特定日期的温度信息。
编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id
。 返回结果无顺序要求。结果格式如下例子所示。
示例
输入: Weather 表:
id | recordDate | Temperature |
---|---|---|
1 | 2015-01-01 | 10 |
2 | 2015-01-02 | 25 |
3 | 2015-01-03 | 20 |
4 | 2015-01-04 | 30 |
c |
输出:
id |
---|
2 |
4 |
解释:
2015-01-02 的温度比前一天高(10 → 25)
2015-01-04 的温度比前一天高(20 → 30)
解题思路
- 核心需求:比较每条记录与其前一天的记录(即
recordDate
相差1天),筛选出当天温度高于前一天的记录。 - 高效连接:使用自连接(
SELF JOIN
)将当天记录(别名a
)与前一天记录(别名b
)关联:- 连接条件:
a.recordDate = b.recordDate + INTERVAL 1 DAY
(确保b
是a
的前一天) - 筛选条件:
a.temperature > b.temperature
- 连接条件:
- 索引优化:在
recordDate
列创建索引可加速日期计算,避免全表扫描。 - 性能关键:直接通过日期差关联(而非子查询或窗口函数),减少内存消耗和计算量。
代码实现(MySQL版)
SELECT
a.id
FROM
Weather a
JOIN
Weather b -- 自连接获取前一天记录
ON
a.recordDate = DATE_ADD(b.recordDate, INTERVAL 1 DAY) -- 精确匹配昨天
WHERE
a.temperature > b.temperature; -- 筛选温度更高的记录
代码说明
- 自连接逻辑:
- 表别名
a
表示当天记录,别名b
表示前一天记录。 DATE_ADD(b.recordDate, INTERVAL 1 DAY)
计算b
的次日日期,与a.recordDate
匹配。
- 表别名
- 高效筛选:
WHERE a.temperature > b.temperature
直接比较温度。
- 索引建议:
- 对
recordDate
创建索引可大幅提升连接速度(实际执行计划依赖数据分布)。
- 对