找到时间间隔之间缺失的间隙
Find the missing gaps in between time intervals
我有一家商店 table,其中有商店名称、代理商名称、日期、shiftStartTime、shiftEndTime。我正在尝试查找是否有任何商店在任何时间间隔内都没有店内代理。数据应按商店、日期分组。以下是我数据中的样本记录
STORE_NAME DISTRICT REGION NAME WORK_DATE ShftStTim ShftEdTimeenter
A0004 65 Mid-West Abc 1/14/2016 12:30:00 12:59:59
A0004 65 Mid-West Abc 1/14/2016 8:00:00 12:30:00
A0004 65 Mid-West Abc 1/14/2016 12:59:59 15:59:59
A0004 65 Mid-West xyz 1/14/2016 19:30:00 20:00:00
A0004 65 Mid-West xyz 1/14/2016 15:00:00 19:30:00
A0004 65 Mid-West xyz 1/14/2016 20:00:00 23:00:00
A0004 65 Mid-West cde 1/14/2016 15:00:00 15:30:00
A0004 65 Mid-West cde 1/14/2016 11:00:00 15:00:00
A0004 65 Mid-West cde 1/14/2016 15:30:00 18:59:59
A0004 65 Mid-West fgh 1/14/2016 15:00:00 15:30:00
A0004 65 Mid-West fgh 1/14/2016 11:00:00 15:00:00
A0004 65 Mid-West fgh 1/14/2016 15:30:00 18:59:59
A0005 64 Mid-West jkl 1/14/2016 13:30:00 14:00:00
A0005 64 Mid-West jkl 1/14/2016 9:59:59 13:30:00
A0005 64 Mid-West jkl 1/14/2016 14:00:00 16:00:00
**A0005 64 Mid-West jkl 1/14/2016 16:30:00 18:00:00**
如果你看到上面的例子,我想得到最后一行,它告诉我们有 30 分钟的间隔,没有代理存在,或者按日期和间隔持续时间的商店名称也可以。 时间范围不连续。提前致谢!
这可能就是您想要做的。
SELECT *
FROM Table1 t1
WHERE NOT EXISTS ( SELECT *
FROM Table1 t2
WHERE t2.WORK_DATE = t1.WORK_DATE
AND t2.STORE_NAME = t1.STORE_NAME
AND (t1.ShftStTim BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter
OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter)
AND (t1.ShftStTim <> t2.ShftStTim
OR t1.ShftEdTimeenter <> t2.ShftEdTimeenter))
这是一个 SQL Fiddle 的。SQL FIDDLE 如果你可以添加数据来破解它,请告诉我。
如果您有一个 UNIQUE ID 来过滤 NOT EXISTS 会很有帮助,但您可以使用 ROW_NUMBER 添加一个,这可能比使用 TIME 位更准确。不过性能可能没那么好。
编辑
;WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER(ORDER BY [STORE_NAME]) AS Rn,
COUNT(*) OVER (PARTITION BY [STORE_NAME], [WORK_DATE]) Cnt
FROM Table1
)
SELECT *
FROM cte t1
WHERE Cnt > 1 -- only stores with more than one shift per day
AND NOT EXISTS ( SELECT *
FROM cte t2
WHERE t1.Rn <> t2.Rn
AND t2.WORK_DATE = t1.WORK_DATE
AND t2.STORE_NAME = t1.STORE_NAME
AND (t1.ShftStTim BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter
OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter)
)
虽然我对覆盖深度感兴趣(每个部分有多少员工),但我正在尝试做类似的事情。我发现了一篇很好的文章,它帮助我获得了大部分解决方案:
我有一家商店 table,其中有商店名称、代理商名称、日期、shiftStartTime、shiftEndTime。我正在尝试查找是否有任何商店在任何时间间隔内都没有店内代理。数据应按商店、日期分组。以下是我数据中的样本记录
STORE_NAME DISTRICT REGION NAME WORK_DATE ShftStTim ShftEdTimeenter
A0004 65 Mid-West Abc 1/14/2016 12:30:00 12:59:59
A0004 65 Mid-West Abc 1/14/2016 8:00:00 12:30:00
A0004 65 Mid-West Abc 1/14/2016 12:59:59 15:59:59
A0004 65 Mid-West xyz 1/14/2016 19:30:00 20:00:00
A0004 65 Mid-West xyz 1/14/2016 15:00:00 19:30:00
A0004 65 Mid-West xyz 1/14/2016 20:00:00 23:00:00
A0004 65 Mid-West cde 1/14/2016 15:00:00 15:30:00
A0004 65 Mid-West cde 1/14/2016 11:00:00 15:00:00
A0004 65 Mid-West cde 1/14/2016 15:30:00 18:59:59
A0004 65 Mid-West fgh 1/14/2016 15:00:00 15:30:00
A0004 65 Mid-West fgh 1/14/2016 11:00:00 15:00:00
A0004 65 Mid-West fgh 1/14/2016 15:30:00 18:59:59
A0005 64 Mid-West jkl 1/14/2016 13:30:00 14:00:00
A0005 64 Mid-West jkl 1/14/2016 9:59:59 13:30:00
A0005 64 Mid-West jkl 1/14/2016 14:00:00 16:00:00
**A0005 64 Mid-West jkl 1/14/2016 16:30:00 18:00:00**
如果你看到上面的例子,我想得到最后一行,它告诉我们有 30 分钟的间隔,没有代理存在,或者按日期和间隔持续时间的商店名称也可以。 时间范围不连续。提前致谢!
这可能就是您想要做的。
SELECT *
FROM Table1 t1
WHERE NOT EXISTS ( SELECT *
FROM Table1 t2
WHERE t2.WORK_DATE = t1.WORK_DATE
AND t2.STORE_NAME = t1.STORE_NAME
AND (t1.ShftStTim BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter
OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter)
AND (t1.ShftStTim <> t2.ShftStTim
OR t1.ShftEdTimeenter <> t2.ShftEdTimeenter))
这是一个 SQL Fiddle 的。SQL FIDDLE 如果你可以添加数据来破解它,请告诉我。
如果您有一个 UNIQUE ID 来过滤 NOT EXISTS 会很有帮助,但您可以使用 ROW_NUMBER 添加一个,这可能比使用 TIME 位更准确。不过性能可能没那么好。
编辑
;WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER(ORDER BY [STORE_NAME]) AS Rn,
COUNT(*) OVER (PARTITION BY [STORE_NAME], [WORK_DATE]) Cnt
FROM Table1
)
SELECT *
FROM cte t1
WHERE Cnt > 1 -- only stores with more than one shift per day
AND NOT EXISTS ( SELECT *
FROM cte t2
WHERE t1.Rn <> t2.Rn
AND t2.WORK_DATE = t1.WORK_DATE
AND t2.STORE_NAME = t1.STORE_NAME
AND (t1.ShftStTim BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter
OR t1.ShftEdTimeenter BETWEEN t2.ShftStTim
AND t2.ShftEdTimeenter)
)
虽然我对覆盖深度感兴趣(每个部分有多少员工),但我正在尝试做类似的事情。我发现了一篇很好的文章,它帮助我获得了大部分解决方案: