Условие
Таблица 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 дня — это ошибка.
Подводные камни
LAG()без проверки дат. Самая частая ошибка: лагнуть строку, забыть, что между ними может быть дыра в неделю.DATEDIFFпорядок. В MySQLDATEDIFF(a, b) = a - b. В SQL ServerDATEDIFF(day, b, a). Перепутали — получите-1.- Дубли по дате. PK по
recordDateгарантирует уникальность; без него self-join даст декартово произведение.
Эталонный ответ
Weather w1 JOIN Weather w2 ON w2.recordDate = w1.recordDate - 1 WHERE w1.temperature > w2.temperature. Через LAG — обязательно проверка разности дат.