我正在尝试了解以下leetcode问题的解决方案: https://leetcode.com/problems/rising-temperature/
给出的解决方案如下:
SELECT weather.id AS 'Id'
FROM weather
JOIN
weather w ON DATEDIFF(weather.date, w.date) = 1
AND weather.Temperature > w.Temperature;
该问题需要计算当前行的温度与先前温度之间的增量。在上面的解决方案中如何实现这一点?看起来正在同一行左右表之间进行比较。
由于表中的数据是每个日期一个值的形式,因此前一个温度的RecordDate
值比一天早,因此为了比较这些值,该表在该条件下JOIN
到自身(即DATEDIFF(w2.RecordDate, w1.RecordDate) = 1
(,以及新行的温度高于前一行的条件(w2.Temperature > w1.Temperature
(,即
SELECT *
FROM Weather w1
JOIN Weather w2 ON DATEDIFF(w2.RecordDate, w1.RecordDate) = 1
AND w2.Temperature > w1.Temperature
如果您查看该查询的所有输出值,您可以看到对于每一行,w2
的RecordDate
值比w1
晚一天,并且w2
的温度高于w1
的温度:
Id RecordDate Temperature Id RecordDate Temperature
1 2015-01-01 00:00:00 10 2 2015-01-02 00:00:00 25
3 2015-01-03 00:00:00 20 4 2015-01-04 00:00:00 30
因此,从该结果来看,这只是仅选择w2.Id
值的问题,即
SELECT w2.Id AS Id
FROM Weather w1
JOIN Weather w2 ON DATEDIFF(w2.RecordDate, w1.RecordDate) = 1
AND w2.Temperature > w1.Temperature
输出
Id
2
4
在 dbfiddle 上演示
JOIN
条件是将一行的数据连接到前一行。 我认为使用日期算法会更明显:
SELECT w.id
FROM weather w JOIN
weather wprev
ON wprev.date = w.date - interval 1 day
WHERE w.Temperature > wprev.Temperature;
这甚至可以利用(date)
上的索引。
也就是说,更明显的解决方案是lag()
- 这是你应该学习的:
select w.*
from (select w.*,
lag(temperature) over (order by date) as prev_temperature
from weather w
) w
where prev_temperature < temperature;
这是我的解决方案:
SELECT table1.Id as 'Id'
FROM Weather as table1
INNER JOIN Weather as table2
ON datediff(table1.RecordDate, table2.RecordDate) = 1
and table1.Temperature> table2.Temperature;