Я генерирую серию дат через PostgreSQL generate_series(min, max)
следующим образом:
SELECT
generate_series(getstartdate(some arguments)
, getenddate(some arguments), interval '1 day')
FROM taskresults
getstartdate()
и getenddate()
возвращают дату начала и окончания данной задачи. У меня есть еще столы Employees(employeeid, taskid, worktime)
и Tasks(taskid, startdate, enddate)
.
Моя цель - сгруппировать рабочее время сотрудников по дням из созданных мной рядов. Как я могу выполнить это соединение? Обратите внимание, что у меня нет прямого доступа к столбцам startdate
и enddate
в таблице Tasks
. Я могу получить доступ к датам только через упомянутые выше функции. Рабочее время указывается в часах в день, поэтому мне нужно агрегировать его через SUM()
для каждой задачи, над которой работает сотрудник, до указанной даты в серии. Проблема в том, что я не знаю, как получить доступ к дате в сгенерированном ряду.
ИЗМЕНИТЬ
Структуры данных:
CREATE TABLE employees
(
employeeid serial NOT NULL,
firstname character varying(32),
lastname character varying(32),
qualification character varying(32),
incomeperhour numeric,
)
CREATE TABLE employeetasks
(
projectid integer,
taskid integer,
employeeid integer,
hoursperday real,
)
CREATE TABLE taskresults
(
simulationid integer,
taskid integer,
duration integer
)
CREATE TABLE tasks
(
projectid integer NOT NULL,
taskname character varying(32),
startdate character varying(32),
enddate character varying(32),
predecessor integer,
minduration integer,
maxduration integer,
taskid integer,
)
Некоторое объяснение:
Вся база данных предназначена для моделирования, поэтому сначала вы определяете расписание задач (в таблице tasks
), а затем запускаете моделирование, которое вставляет результаты в taskresults
. Как видите, я сохраняю только duration
в результатах, поэтому я могу получить доступ к диапазонам дат для каждой задачи только с помощью функций getstartdate
/ getenddate
. Таблица employeetasks
в основном назначает сотрудников из таблицы employees
в таблицу task
с указанием количества часов, в течение которых они работают над этой задачей в день.
1 ответ
Вы можете JOIN
в сгенерированной серии, как и все остальное.
INNER JOIN generate_series(getstartdate(some arguments), getenddate(some arguments), interval '1 day') workday ON (...)
Условие соединения сложно определить, не зная, как хранятся ваши данные.
Кроме того, у вас странная структура данных. У сотрудников есть «таскид»? n: 1 сотрудник -> задача? Я не могу написать полный запрос, потому что не понимаю структуры данных.
Похожие вопросы
Новые вопросы
postgresql
PostgreSQL — это система управления реляционными базами данных (RDBMS) с открытым исходным кодом, доступная для всех основных платформ, включая Linux, UNIX, Windows и OS X. Задавая вопросы, указывайте свою версию Postgres. Обратитесь к dba.stackexchange.com для вопросов, касающихся администрирования или дополнительных функций.