之间的时间,努力了解我们的日常调度问题一天之内的范围我一直在负责寻找差距。我看到关于这一主题的讨论很多,似乎充分确定的是游标通常要避免,这是一种耻辱,因为我知道如何做这些。识别时间差距日期项与起始和终止列
共识似乎像递归CTE是需要采取的方法,并且这些示例很丰富,但是基于与我的不同的源数据结构,通常跨越较长的时间段,并且看着“日”粒度而不是按分钟(我正在以15分钟的间隔工作,但这可能会改变)。下面是我一起工作的源数据的样本:
我的兴趣仅仅是在寻找在MIN(STARTTIME)和MAX(ENDTIME)之间的日程安排的空白,为这一天,写这些差距到另一张桌子。因为我有一些在上面描绘格式提供时查看数据相当快的查询,我想我有什么解决方案插入到补充表相同的格式。
一个努力我做:
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID('#test', 'U') IS NOT NULL
Drop table #test
CREATE TABLE #test (
daterow int IDENTITY,
obj_id int,
datestart datetime,
dateend datetime
);
INSERT INTO #test
SELECT
1,
'2014-12-14 07:00:00',
'2014-12-14 08:45:00'
UNION
SELECT
1,
'2014-12-14 09:00:00',
'2014-12-14 09:45:00'
UNION
SELECT
1,
'2014-12-14 10:00:00',
'2014-12-14 11:45:00'
UNION
SELECT
1,
'2014-12-14 12:00:00',
'2014-12-14 14:45:00'
UNION
SELECT
2,
'2014-12-14 07:00:00',
'2014-12-14 07:45:00'
UNION
SELECT
2,
'2014-12-14 08:00:00',
'2014-12-14 10:45:00';
WITH C1 AS (
SELECT obj_id, ts, Type
,e=CASE Type WHEN 1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY obj_id, Type ORDER BY dateend) END
,s=CASE Type WHEN -1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY obj_id, Type ORDER BY datestart) END
FROM #test
CROSS APPLY (
VALUES (1, datestart), (-1, dateend)) a(Type, ts)
),
C2 AS (
SELECT C1.*
,se=ROW_NUMBER() OVER (PARTITION BY obj_id ORDER BY ts, Type DESC)
FROM C1),
C3 AS (
SELECT obj_id, ts
,grpnm=FLOOR((ROW_NUMBER() OVER (PARTITION BY obj_id ORDER BY ts)-1)/2 + 1)
FROM C2
WHERE COALESCE(s-(se-s)-1, (se-e)-e) = 0),
-- C1, C2, C3, C4 combined remove the overlapping date periods
C4 AS (
SELECT obj_id, datestart=MIN(ts), dateend=MAX(ts)
FROM C3
GROUP BY obj_id, grpnm)
SELECT obj_id, datestart=MIN(newdate), dateend=MAX(newdate)
FROM (
SELECT obj_id, newdate
,rn=ROW_NUMBER() OVER (PARTITION BY obj_id ORDER BY newdate)/2
FROM C4 a
CROSS APPLY (
VALUES (datestart-1),(dateend+1)) b(newdate)
) a
GROUP BY obj_id, rn
HAVING COUNT(*) = 2
ORDER BY obj_id, datestart;
导致在这个输出:
结果都是错误的,但我觉得它可能使在早上更有意义。也许有人可以揭示我的致命缺陷?
可以添加预期输出 – 2014-12-19 09:33:39
@ n8您正在使用什么版本的SQL Server? – 2014-12-19 09:35:47
如果您可以想象使用游标的解决方案,然后使用它们。务实 - 游标可以是缓慢的和资源密集型的,但在某些情况下,它们肯定有一个地方,它们更难以以集合为导向解决。 – Rikalous 2014-12-19 09:37:13