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