1

我通过 PostgreSQLgenerate_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表中,他们每天在该任务中工作的小时数。

4

1 回答 1

0

您可以JOIN在生成的系列上像其他任何东西一样。

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

如果不知道您的数据是如何存储的,则很难计算出联接条件。

此外,您的数据结构很奇怪。员工有“taskid”吗?n:1 员工 -> 任务?我真的不能写一个完整的查询,因为我没有得到数据结构。

于 2012-10-12T10:14:38.737 回答