0

「ジョブ」テーブルと「ジョブステータス」テーブルがあります。

Job ( 
    id SERIAL PRIMARY KEY NOT NULL, 
    PackageInstance_id bigint NOT NULL, 
    BuildClient_id bigint 
) 

JobStatus ( 
    id SERIAL PRIMARY KEY NOT NULL, 
    Job_id bigint NOT NULL, 
    Status_id bigint NOT NULL, 
    time timestamp NOT NULL DEFAULT now() 
)

このステータスのタイムスタンプが、問題のジョブが過去 10 分以内に終了したことを示している場合、最新のステータスが「終了」と報告されたすべてのジョブを選択するクエリが必要です。

私は SQL ウィザードではありません。これをどのように設計するのですか?-私はすでに未完成の仕事を手に入れることができます。それは私を得る時間です。ある種の DATEDIFF を実行する必要があり、タイムスタンプが Now() から x 分未満である SELECT を実行するか、CURRENT_TIMESTAMP を取得するための関数を実行する必要があると想定しています。

何か助けはありますか?私はPostgreSQLを使用しています。

4

4 に答える 4

2
select j.*
from
    job j
    inner join (
        select j.id, max("time") "time"
        from
            job j
            inner join jobstatus js on j.id = js.job_id
        where
            "time" > now() - interval '10 minutes'
            and
            js.status_id = 3 -- finished
        group by j.id
    ) s on s.id = j.id
于 2012-11-20T10:17:15.760 に答える
0

これを行う方法は次のとおりです。

select
    js.JobId
    , MAX(js.StatusDate) as LatestStatusDate
into #MostRecentStatuses
from #JobStatus js
group by js.JobId

select *
from #MostRecentStatuses mrs
join #JobStatus js
    on js.JobId = mrs.JobId
    and js.StatusDate = mrs.LatestStatusDate
join #JobStatusNames jsn
    on jsn.JobStatusId = js.JobStatusId
join #Jobs j
    on j.Id = mrs.JobId
where
    mrs.LatestStatusDate >= DATEADD(MINUTE, -10, GETDATE())
    and jsn.StatusName = 'Finished'

あなたのテーブルは次のように定義されていると仮定しました:

create table #Jobs
(
    Id int
    , Name nvarchar(max)
)

create table #JobStatusNames
(
    JobStatusId int
    , StatusName nvarchar(max)
)

create table #JobStatus
(
    JobId int
    , JobStatusId nvarchar(max)
    , StatusDate datetime
)
于 2012-11-20T09:58:03.480 に答える
0

status_id があることがわかりましたので、job_status_names を持つテーブルがもう 1 つあるはずです

select * 
from jobs j 
 join ( select 
         job_id, 
         status_id 
       from jobstatus 
       where (job_id, time) in ( select job_id, 
                                        max(time) 
                                 from jobstatus 
                                 where time >= now() - interval '10 minutes'
                                 group by job_id) 
      ) as foo on j.id = foo.job_id 
 where status_id = (select id from job_status_names where status_name = 'finished')
于 2012-11-20T10:03:16.987 に答える
0

この関連タスクのように解決できます(詳細については、リンクをたどってください)。

SELECT * FROM (
    SELECT DISTINCT ON (j.id)
           j.*
    FROM   job j
    JOIN   jobstatus js ON js.job_id = j.id
    WHERE  job_time >= (now() - interval '10 min')
    ORDER  BY j.id, js.status_id <> 123  -- or whatever signifies 'finished'
    ) x
WHERE status_id = 123 -- 'finished'
  • およびの前にソートされるORDER BYため、句は機能します。したがって、「終了」が最初に来ます(存在する場合)。アウターは出来上がったものだけをとります。FALSETRUENULLSELECT

  • なぜあなたstatus_idbigint? 「完了」/「未完了」以上のものがある場合は、booleanそれを変更してください。意味がありません。enumbigint

  • 他のすべてのbigint列はおそらくinteger.

于 2012-11-20T12:47:03.507 に答える