【问题标题】:PostgreSQL access to generate_series() cellsPostgreSQL 访问 generate_series() 单元
【发布时间】:2012-10-12 09:10:31
【问题描述】:

我通过 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)

我的目标是从我生成的系列中按每天对员工的工作时间进行分组。如何执行此连接?请注意,我无法直接访问Tasks 表中的startdateenddate 列,我只能通过上面提到的那些函数访问日期。工作时间以小时/天为单位,因此我必须通过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 表,他们每天在该任务中工作的小时数。

【问题讨论】:

  • “任务结果”的定义是什么?
  • 我用表格定义和一些解释更新了我的帖子
  • 我只是无法弄清楚其余部分应该如何组合在一起,您遇到的问题到底是什么,或者这些神奇的 getstartdate 和 getenddate 函数的目的是什么。
  • 任务表存储任务,它们可以定义为 4 种不同的类型(startdate + minmax duration、enddate + minmaxduration、startdate + enddate、previous + minmaxduration)。第三种类型是我可以获得固定开始和结束日期的唯一类型。在其他 3 种情况下,定义任务日期范围的其余列为 NULL。 getstartdate/getenddate 基本上通过 taskresults 中的持续时间构建 avgs/quantiles 来返回日期。我希望这是可以理解的:/
  • 我认为您需要将架构简化到最低限度,以说明您需要帮助的问题,摆脱所有无关紧要的复杂性。

标签: postgresql join generate-series


【解决方案1】:

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

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

在不知道如何存储数据的情况下很难计算出联接条件。

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

【讨论】:

    猜你喜欢
    • 2022-09-24
    • 2011-11-19
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多