🔥 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 • активные договоры • активные подписки • количество работающих пользователей по дням 📊

🔥 Live Coding: headcount по дням за март 2025
Задача:
Есть таблица employees:
• employeeid
• hiredate
• firedate
Нужно посчитать количество активных сотрудников на каждый день марта 2025 | Сетка — социальная сеть от hh.ru