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() 
)

我想要一个查询来选择最近报告状态为“已完成”的所有作业,如果此状态的时间戳表明相关的 jon 在过去 10 分钟内完成。

我不是 SQL 向导。这个怎么设计?- 我已经可以完成未完成的工作,它让我得到了时间。我假设我们需要做某种 DATEDIFF,并选择时间戳从 Now() 到 x 分钟以内的地方,或者任何获取 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

可以像这个相关任务一样解决(点击链接获取更多解释):

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子句有效,因为FALSE排序在TRUEand之前NULL。所以“完成”首先出现(如果存在)。外层SELECT只取成品。

  • 为什么你会status_id是一个bigint?如果您有超过“完成”/“未完成”,请将其更改为boolean或可能。没有意义。enumbigint

  • 您的所有其他bigint列可能应该是integer.

于 2012-11-20T12:47:03.507 回答
0

我看到你有 status_id 所以应该还有一张带有 job_status_names 的表

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 回答