Собесов

LeetCode SQL — Rising Temperature: сравнение с вчерашним днём

SQLSelf-join по датеЛёгкаяJunior

Условие

Таблица Weather(id, recordDate, temperature). Верните все id дней, когда температура выше вчерашней. Дни могут быть с пропусками — сравниваем именно с предыдущим календарным днём (минус 1 день, не с предыдущей строкой).

Решение

Self-join по recordDate = prev + 1

SELECT w1.id
FROM Weather w1
JOIN Weather w2
  ON w2.recordDate = w1.recordDate - INTERVAL '1 day'
WHERE w1.temperature > w2.temperature;

В MySQL: DATE_SUB(w1.recordDate, INTERVAL 1 DAY) или DATEDIFF(w1.recordDate, w2.recordDate) = 1.

Через LAG() с проверкой на дату

WITH lagged AS (
  SELECT
    id, recordDate, temperature,
    LAG(temperature) OVER (ORDER BY recordDate) AS prev_temp,
    LAG(recordDate)  OVER (ORDER BY recordDate) AS prev_date
  FROM Weather
)
SELECT id
FROM lagged
WHERE temperature > prev_temp
  AND recordDate - prev_date = 1;

LAG без recordDate - prev_date = 1 ловил бы любые подряд идущие записи, даже через 3 дня — это ошибка.

Подводные камни

  1. LAG() без проверки дат. Самая частая ошибка: лагнуть строку, забыть, что между ними может быть дыра в неделю.
  2. DATEDIFF порядок. В MySQL DATEDIFF(a, b) = a - b. В SQL Server DATEDIFF(day, b, a). Перепутали — получите -1.
  3. Дубли по дате. PK по recordDate гарантирует уникальность; без него self-join даст декартово произведение.

Эталонный ответ

Weather w1 JOIN Weather w2 ON w2.recordDate = w1.recordDate - 1 WHERE w1.temperature > w2.temperature. Через LAG — обязательно проверка разности дат.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти