Это надуманный пример некоторых данных планирования, которые мы обрабатываем.
Идея в том, чтобы наивно задавать вопрос
Учитывая, что у проекта есть N оставшихся незапланированных часов, head_count (количество людей, работающих над ним), и предположение, что каждый работник будет работать 8 дней; какие дни, кроме выходных, ПОСЛЕ последнего запланированного дня потребует этот проект?
У меня есть упрощенная таблица dim_dates:
CREATE TABLE dim_dates (
date_actual DATE NOT NULL,
is_weekend BOOLEAN NOT NULL
);
И таблица проектов:
CREATE TABLE projects (
id SERIAL PRIMARY KEY NOT NULL,
last_scheduled_date DATE NOT NULL,
remaining_hours_required INT NOT NULL,
head_count INTEGER NOT NULL
);
Итак, учитывая этот проект:
INSERT INTO projects (last_scheduled_date, remaining_hours_required, head_count)
VALUES ('2018-01-04', 21, 1);
Принимая CEIL(remaining_hours_required::decimal / (8 * head_count))
, мы получаем 3 дня работы. Дата 2018-01-04 - четверг, поэтому в итоге мы должны указать следующую пятницу, понедельник и вторник.
Чтобы получить следующие дни, кроме выходных, мы легко можем присоединиться к dim_dates:
SELECT p.*, d.*
FROM projects p
INNER JOIN dim_dates d ON (
d.date_actual > p.last_scheduled_date
AND
d.is_weekend IS FALSE
);
Что даст нам все следующих дат, которые не являются выходными. Моя загадка состоит в том, как отфильтровать этот набор до 3 строк.
Итак (обязательное) описание задачи:
- Рассчитайте оставшиеся дни, необходимые для выполнения проекта
- Взять все dim_dates, где is_weekend равно false, а date_actual выше последней запланированной даты проекта
Вот скрипка с данными: http://sqlfiddle.com/#!17/f6a90/3