Я генерирую серию дат через 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
Thomas Pischulski 12 Окт 2012 в 13:10
Каково определение «результатов задачи»?
 – 
Craig Ringer
12 Окт 2012 в 14:16
Я обновил свой пост определениями таблиц и некоторыми пояснениями
 – 
Thomas Pischulski
12 Окт 2012 в 14:30
Я просто не могу понять, как все остальное должно соответствовать друг другу, в чем именно заключается проблема, или для чего предназначены эти волшебные функции getstartdate и getenddate.
 – 
Craig Ringer
12 Окт 2012 в 14:51
В таблице задач хранятся задачи, и они могут быть определены в 4 различных типах (начальная дата + минимальная длительность, конечная дата + минимальная длительность, начальная дата + конечная дата, предшественник + минимальная длительность). Третий тип - единственный тип, в котором я могу получить фиксированную дату начала и окончания. В остальных трех случаях остальные столбцы, определяющие диапазон дат задач, имеют значение NULL. getstartdate / getenddate в основном возвращает мне даты путем построения средних / квантилей через длительность в taskresults. Надеюсь, это как-то понятно: /
 – 
Thomas Pischulski
12 Окт 2012 в 14:56
Я думаю, вам нужно упростить схему до минимума, чтобы проиллюстрировать проблему, с которой вам нужна помощь, избавившись от всей посторонней и несущественной сложности.
 – 
Craig Ringer
12 Окт 2012 в 14:58

1 ответ

Лучший ответ

Вы можете JOIN в сгенерированной серии, как и все остальное.

INNER JOIN generate_series(getstartdate(some arguments), getenddate(some arguments), interval '1 day') workday ON (...)

Условие соединения сложно определить, не зная, как хранятся ваши данные.

Кроме того, у вас странная структура данных. У сотрудников есть «таскид»? n: 1 сотрудник -> задача? Я не могу написать полный запрос, потому что не понимаю структуры данных.

0
Craig Ringer 12 Окт 2012 в 14:14