К обычному разбору
Тренировка по собеседованию1 задачаТехническое собеседованиеСберДата не указана

Сбер антифрод: SQL по календарному окну

Идите сверху вниз: сначала попробуйте сами, затем откройте разбор. Если шаг с кодом, пишите решение прямо здесь и запускайте проверки на странице.

1SQL-задачаEasy

Средняя температура за последние 3 календарных дня

Условие

Есть таблица дневной средней температуры:

CREATE TABLE temperatures (
  dt TEXT PRIMARY KEY,
  avg_temperature REAL NOT NULL
);

Для каждой даты верните среднюю температуру за последние 3 календарных дня: текущая дата, вчера и позавчера.

Если каких-то дат в таблице нет, они просто не участвуют в среднем.

Верните dt, avg_temperature_3d. Отсортируйте результат по dt ASC.

Решение прямо на странице

Напишите код, запустите проверки и только потом открывайте разбор.

Проверка решения

Нажмите «Запустить проверки» или Ctrl+Enter.

Показать разбор

Подсказки

  • Календарное окно

    В SQLite можно использовать date(cur.dt, '-2 day').

  • Пропуски дат

    Не надо генерировать отсутствующие даты: усредняйте только строки, которые есть в таблице.

Идея решения

Так как окно задано календарными днями, а не количеством строк, проще использовать self join. Для каждой строки cur берем строки hist, где hist.dt попадает между date(cur.dt, '-2 day') и cur.dt.

После этого группируем по текущей дате и считаем AVG(hist.avg_temperature).

Эталонный код

SELECT
  cur.dt,
  AVG(hist.avg_temperature) AS avg_temperature_3d
FROM temperatures cur
JOIN temperatures hist
  ON hist.dt BETWEEN date(cur.dt, '-2 day') AND cur.dt
GROUP BY cur.dt
ORDER BY cur.dt ASC;
Сложность
Время: O(n^2). Память: O(n).
Простое решение через self join сравнивает каждую дату с кандидатами из трехдневного календарного окна; в реальной БД индекс по dt снижает стоимость поиска диапазона.