1

私はgenerate_series(min, max)次の方法でPostgreSQLを介して日付系列を生成しています:

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を使用して各タスクの日付範囲にのみアクセスできます。このテーブルは基本的に、従業員をテーブルからテーブルに割り当て、1日あたりそのタスクで作業している時間数を示します。getstartdategetenddateemployeetasksemployeestask

4

1 に答える 1

0

生成されたシリーズは、他のシリーズと同じように使用できJOINます。

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

データがどのように保存されているかを知らなければ、結合条件を理解するのは困難です。

また、データ構造がおかしいです。従業員は「タスクID」を持っていますか?n:1従業員->タスク?完全なクエリを実際に作成することはできません。データ構造を取得できません。

于 2012-10-12T10:14:38.737 に答える