В work_modes — режимы работы сотрудников: табельный номер tab_num, период start_date – finish_date (оба включительно) и флаги d1–d5 — нужно ли быть в офисе с понедельника по пятницу (1 или 0). Периоды одного сотрудника не пересекаются.
Бессрочный режим записан с finish_date = 9999-12-31: для него концом считается end_da — дата окончания трудового договора, если она есть. У обычных режимов end_da не смотрим.
wplace_type = 1 — флаги действуют каждую неделю. wplace_type = 2 — гибрид: неделя по флагам чередуется с неделей дома. Недели отсчитываются от start_date: дни 0–6 — по флагам, 7–13 — дома (0), 14–20 — снова по флагам.
Постройте календарь с 1 по 14 сентября 2025 года для каждого сотрудника из таблицы: tab_num, day, to_be_at_office. Суббота, воскресенье и дни, не покрытые ни одним режимом, — NULL. Порядок — tab_num, day.
В работе: Планирование рабочих мест и пропусков в офис на месяц вперёд.
Таблицы
work_modes — одна строка — один период режима работы сотрудника
| Колонка | Тип | Что значит |
|---|---|---|
tab_num | int | табельный номер |
start_date | date | начало |
finish_date | date | конец, 9999-12-31 — бессрочно |
wplace_type | int | 1 — каждую неделю, 2 — через неделю |
d1 | smallint | понедельник: 1 — офис |
d2 | smallint | вторник |
d3 | smallint | среда |
d4 | smallint | четверг |
d5 | smallint | пятница |
end_da | date | конец договора, может быть NULL |
Пример: данные
work_modes · 4 строки
| tab_num | start_date | finish_date | wplace_type | d1 | d2 | d3 | d4 | d5 | end_da |
|---|---|---|---|---|---|---|---|---|---|
| 1001 | 2025-08-01 | 2025-09-09 | 1 | 1 | 1 | 0 | 0 | 1 | NULL |
| 1001 | 2025-09-10 | 9999-12-31 | 1 | 1 | 1 | 1 | 1 | 1 | 2025-09-11 |
| 1002 | 2025-08-25 | 9999-12-31 | 2 | 1 | 0 | 1 | 0 | 1 | NULL |
| 1003 | 2025-09-08 | 2025-09-30 | 1 | 0 | 1 | 1 | 1 | 0 | NULL |
Ожидаемый ответ
| tab_num | day | to_be_at_office |
|---|---|---|
| 1001 | 2025-09-01 | 1 |
| 1001 | 2025-09-02 | 1 |
| 1001 | 2025-09-03 | 0 |
| 1001 | 2025-09-04 | 0 |
| 1001 | 2025-09-05 | 1 |
| 1001 | 2025-09-06 | NULL |
| 1001 | 2025-09-07 | NULL |
| 1001 | 2025-09-08 | 1 |
| 1001 | 2025-09-09 | 1 |
| 1001 | 2025-09-10 | 1 |
| 1001 | 2025-09-11 | 1 |
| 1001 | 2025-09-12 | NULL |
| 1001 | 2025-09-13 | NULL |
| 1001 | 2025-09-14 | NULL |
| 1002 | 2025-09-01 | 0 |
| 1002 | 2025-09-02 | 0 |
| 1002 | 2025-09-03 | 0 |
| 1002 | 2025-09-04 | 0 |
| 1002 | 2025-09-05 | 0 |
| 1002 | 2025-09-06 | NULL |
| 1002 | 2025-09-07 | NULL |
| 1002 | 2025-09-08 | 1 |
| 1002 | 2025-09-09 | 0 |
| 1002 | 2025-09-10 | 1 |
| 1002 | 2025-09-11 | 0 |
| 1002 | 2025-09-12 | 1 |
| 1002 | 2025-09-13 | NULL |
| 1002 | 2025-09-14 | NULL |
| 1003 | 2025-09-01 | NULL |
| 1003 | 2025-09-02 | NULL |
| 1003 | 2025-09-03 | NULL |
| 1003 | 2025-09-04 | NULL |
| 1003 | 2025-09-05 | NULL |
| 1003 | 2025-09-06 | NULL |
| 1003 | 2025-09-07 | NULL |
| 1003 | 2025-09-08 | 0 |
| 1003 | 2025-09-09 | 1 |
| 1003 | 2025-09-10 | 1 |
| 1003 | 2025-09-11 | 1 |
| 1003 | 2025-09-12 | 0 |
| 1003 | 2025-09-13 | NULL |
| 1003 | 2025-09-14 | NULL |
SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
tab_num, day, to_be_at_office
Источник: тестовое инженера данных в Сбере, сборник No Data No Growth. Условие пересказано своими словами.
Посмотреть данные, проверить кусок запроса. На зачёт не влияет.
Здесь появится результат отправки.