Sql 基于时间戳进行计数

Sql 基于时间戳进行计数,sql,sql-server,timestamp,Sql,Sql Server,Timestamp,我有一个查询,它给出了以下结果。此结果集包含服务器上作业的启动时间和完成时间 JobName LatestStartTime LatestEndTime Job1 2016-04-15 00:00:40.000 2016-04-15 00:07:40.000 Job2 2016-04-15 00:01:23.000 2016-04-15 00:17:37.000 Job3

我有一个查询,它给出了以下结果。此结果集包含服务器上作业的启动时间和完成时间

JobName             LatestStartTime         LatestEndTime
Job1                2016-04-15 00:00:40.000 2016-04-15 00:07:40.000
Job2                2016-04-15 00:01:23.000 2016-04-15 00:17:37.000
Job3                2016-04-15 08:00:03.000 2016-04-15 08:18:05.000
Job4                2016-04-15 08:30:06.000 2016-04-15 08:57:21.000
Job5                2016-04-15 09:00:03.000 2016-04-15 09:07:49.000
Job6                2016-04-15 03:53:40.000 2016-04-15 03:53:41.000
Job7                2016-04-15 09:30:07.000 2016-04-15 11:36:35.000
另一方面,我有一个查询,它以15分钟的间隔创建一个临时表。详情如下:

Increment
2016-04-15 00:00:00.000
2016-04-15 00:15:00.000
2016-04-15 00:30:00.000
2016-04-15 00:45:00.000
2016-04-15 01:00:00.000
2016-04-15 01:15:00.000
2016-04-15 01:30:00.000
2016-04-15 01:45:00.000
2016-04-15 02:00:00.000
2016-04-15 02:15:00.000
2016-04-15 02:30:00.000
2016-04-15 02:45:00.000
我想知道哪些作业以确定的增量运行。例如,我的最终结果集应该如下所示:

Increment                     NumberOfJobs    JobNames
2016-04-15 00:00:00.000       2               Job1, Job2
2016-04-15 00:15:00.000       1               Job2
2016-04-15 00:30:00.000       0               NULL


最困难的部分是在一行中获取作业列表。计数很简单:

select t.increment, j.jobname,
       sum(count(*)) over (partition by t.increment) as countOfJobs
from times t left join
     jobs j
     on t.increment >= j.lasteststarttime and
        t.increment <= j.lastestendtime
group by t.increment, j.jobname
order by increment, jobname;
选择t.increment,j.jobname,
将(按t.increment划分)上的和(计数(*)作为作业计数
从左到右
乔布斯j
在t.increment>=j.lasteststarttime和
t、 增量=j2.lasteststarttime和
t、 增量=j.最新开始时间和
t、 增量试试这个:

SELECT [increment], JobName
, Count(1) over (Partition by [increment]) AS NumberOfJobs    
FROM temp_table
INNER JOIN (
  SELECT JobName, st.t AS t1, LatestEndTime AS t2
  FROM query AS q
  OUTER APPLY (
    SELECT Max([increment]) AS t 
    FROM temp_table 
    WHERE [increment] < q.LatestStartTime) as st
  ) as j ON Increment BETWEEN j.t1 and j.t2
使用左连接:

SELECT [increment], JobName
, Count(JobName) over (Partition by [increment]) AS NumberOfJobs    
FROM temp_table
LEFT JOIN (
  SELECT JobName, st.t AS t1, LatestEndTime AS t2
  FROM query AS q
  OUTER APPLY (
    SELECT Max([increment]) AS t 
    FROM temp_table 
    WHERE [increment] < q.LatestStartTime) as st
  ) as j ON Increment BETWEEN j.t1 and j.t2

您得到了错误的结果,要在间隔后获得正确的作业,您需要从temp_表中选择Max([increment])作为t,其中[increment]
谢谢!这个查询正好符合我的要求!
select t.increment, count(*) as numJobs,
       stuff((select ', ' + j2.jobname
              from jobs j2
              where t.increment >= j2.lasteststarttime and
                    t.increment <= j2.lastestendtime
              for xml path ('')
             ), 1, 1, '') as jobs
from times t  left join
         jobs j
         on t.increment >= j.lasteststarttime and
            t.increment <= j.lastestendtime
group by t.increment
order by increment;
SELECT [increment], JobName
, Count(1) over (Partition by [increment]) AS NumberOfJobs    
FROM temp_table
INNER JOIN (
  SELECT JobName, st.t AS t1, LatestEndTime AS t2
  FROM query AS q
  OUTER APPLY (
    SELECT Max([increment]) AS t 
    FROM temp_table 
    WHERE [increment] < q.LatestStartTime) as st
  ) as j ON Increment BETWEEN j.t1 and j.t2
increment   JobName NumberOfJobs
2016-04-15 00:00:00.000 Job1    2
2016-04-15 00:00:00.000 Job2    2
2016-04-15 00:15:00.000 Job2    1
2016-04-15 02:45:00.000 Job3    5
2016-04-15 02:45:00.000 Job4    5
2016-04-15 02:45:00.000 Job5    5
2016-04-15 02:45:00.000 Job6    5
2016-04-15 02:45:00.000 Job7    5
SELECT [increment], JobName
, Count(JobName) over (Partition by [increment]) AS NumberOfJobs    
FROM temp_table
LEFT JOIN (
  SELECT JobName, st.t AS t1, LatestEndTime AS t2
  FROM query AS q
  OUTER APPLY (
    SELECT Max([increment]) AS t 
    FROM temp_table 
    WHERE [increment] < q.LatestStartTime) as st
  ) as j ON Increment BETWEEN j.t1 and j.t2
2016-04-15 00:00:00.000 Job1    2
2016-04-15 00:00:00.000 Job2    2
2016-04-15 00:15:00.000 Job2    1
2016-04-15 00:30:00.000 NULL    0
2016-04-15 00:45:00.000 NULL    0
2016-04-15 01:00:00.000 NULL    0
2016-04-15 01:15:00.000 NULL    0
2016-04-15 01:30:00.000 NULL    0
2016-04-15 01:45:00.000 NULL    0
2016-04-15 02:00:00.000 NULL    0
2016-04-15 02:15:00.000 NULL    0
2016-04-15 02:30:00.000 NULL    0
2016-04-15 02:45:00.000 Job3    5
2016-04-15 02:45:00.000 Job4    5
2016-04-15 02:45:00.000 Job5    5
2016-04-15 02:45:00.000 Job6    5
2016-04-15 02:45:00.000 Job7    5