比较当前行与上一行 - leetcode 解决方案



我正在尝试了解以下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

如果您查看该查询的所有输出值,您可以看到对于每一行,w2RecordDate值比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;

最新更新