🔥 Live Coding: headcount по дням за март 2025
Задача: Есть таблица employees:
• employee_id • hire_date • fire_date
Нужно посчитать количество активных сотрудников на каждый день марта 2025.
На выходе хотим получить:
• dt • headcount
Решение:
with calendar as ( select toDate('2025-03-01') + number as dt from numbers(31) )
select c.dt, count() as headcount from calendar c inner join employees e on e.hire_date <= c.dt and (e.fire_date is null or e.fire_date >= c.dt) group by c.dt order by c.dt
🧠 Как здесь думаем:
Сначала нам нужен календарь на каждый день марта 2025.
Для этого генерируем даты: • от 2025-03-01 • до 2025-03-31
Дальше для каждой даты проверяем: активен ли сотрудник в этот день.
Сотрудник активен, если: • hire_date <= dt • и fire_date >= dt или fire_date is null, если он еще работает ✅
После этого просто считаем количество таких сотрудников на каждую дату.
Это и будет daily headcount.
⚠️ Где можно ошибиться:
Неправильно понять active employee
Очень частая ошибка — не включать день увольнения. Но обычно если fire_date = dt, значит в этот день сотрудник еще числится. Поэтому условие должно быть:
fire_date >= dt
а не fire_date > dt
Забыть про fire_date is null
Если не учесть null, все действующие сотрудники просто выпадут из расчета ❌
Пытаться считать только по hire_date и fire_date без календаря
Тогда ты не получишь headcount на каждый день. Для daily headcount календарная таблица почти всегда обязательна.
💡 Альтернативная мысль:
Это решение простое и читаемое. Но на очень больших объемах такой join “каждый день × сотрудники” может быть тяжеловат.
Тогда задачу можно решать через event-based подход: • +1 в день найма • -1 после дня увольнения • потом посчитать кумулятивную сумму
Но для понимания логики и для большинства учебных задач вариант с календарем — самый наглядный 👌
🎯 Вывод:
Это классическая задача на интервалы дат.
Главная идея: мы не смотрим на сотрудников “вообще”, а проверяем, кто пересекается с каждой конкретной датой.
Именно так обычно считают: • daily headcount • активные договоры • активные подписки • количество работающих пользователей по дням 📊