Войти Регистрация
Data base

220. Дни рождения подписчиков Плюса на неделе

Сложная

В plus_users — подписчики Яндекс Плюса с датой рождения birth_date (NULL, если не указана). В mailing_runs одна строка: run_date — день запуска рассылки с подарком ко дню рождения.

Найдите подписчиков, у которых день рождения попадает в 7 дней с run_date по run_date + 6 включительно. Родившиеся 29 февраля в невисокосный год празднуют 28 февраля. Верните user_id, birthday — дату ближайшего дня рождения и turns — сколько лет исполняется в этот день. Порядок — по birthday, затем user_id.

В работе: Еженедельная рассылка промокода ко дню рождения: в последнюю неделю декабря именинники января не должны пропасть.

Таблицы

plus_users — подписчики

КолонкаТипЧто значит
user_idintключ
birth_datedateдата рождения, NULL — не указана
plantextтариф подписки

mailing_runs — одна строка — дата запуска

КолонкаТипЧто значит
run_datedateдень рассылки

Пример: данные

plus_users · 6 строк

user_idbirth_dateplan
11990-06-10Плюс
21985-06-16Плюс Мульти
31999-06-17Плюс
42001-06-09Плюс
5NULLПлюс
61972-06-12Плюс Мульти

mailing_runs · 1 строка

run_date
2026-06-10

Ожидаемый ответ

user_idbirthdayturns
12026-06-1036
62026-06-1254
22026-06-1641
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 6 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
user_id, birthday, turns
датыNULLподзапрос

Источник: наша задача на данных Яндекса: подарки подписчикам Плюса ко дню рождения. Условие пересказано своими словами.