我有一个商店表,其中包含storename,agentname,date,shiftStartTime,shiftEndTime。我试图找出是否有任何商店在任何时间间隔存在没有代理存储。数据应按商店,日期分组。以下是我数据的样本记录
i1 <- with(mydf, V1==3)
mydf[sort(unique(c(which(i1),pmin(which(i1)+1L, nrow(mydf))))),]
如果你看到上面的例子,我想得到最后一行,它告诉我们有30分钟的间隙,没有代理商存在或按日期存储名称,差距的持续时间也可以。 时间范围不是连续的。提前谢谢!
答案 0 :(得分:1)
这可能是你想要做的。
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小提琴.. SQL FIDDLE如果你可以添加数据来打破它,请告诉我。
如果你有一个唯一的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)
)
答案 1 :(得分:1)
我试图做类似的事情虽然我对覆盖深度感兴趣(每个细分市场中有多少员工)。我找到了一篇很好的文章,帮助我完成了解决方案的大部分工作: