我似乎无法让它按照我需要的方式工作。我有两张桌子Assignment
和Event
。
Assignment
StartDate EndDate Equipment
4/1/2016 4/23/2016 1001
4/3/2016 4/10/2016 1002
3/30/2016 4/20/2016 1003
Event
StartDate EndDate Equipment Event
4/2/2016 4/3/2016 1001 maintenance
4/8/2016 4/10/2016 1001 maintenance
4/4/2016 4/5/2016 1002 maintenance
我需要加入设备并有一个使用事件划分分配的输出。对于此示例数据,我将得到如下所示的输出:
StartDate EndDate Equipment EventStatus
4/1/2016 4/2/2016 1001 Active
4/2/2016 4/3/2016 1001 maintenance
4/3/2016 4/8/2016 1001 Active
4/8/2016 4/10/2016 1001 maintenance
4/10/2016 4/23/2016 1001 Active
4/3/2016 4/4/2016 1002 Active
4/4/2016 4/5/2016 1002 maintenance
4/5/2016 4/10/2016 1002 Active
3/30/2016 4/20/2016 1003 Active
所以对于设备号 1001;它被分配到任务中,然后进行了两次维护。该维护将作业分为 5 个部分,如下所示:
---------------------------------------------------------------------
| Active |maintenance| Active |maintenance| Active |
---------------------------------------------------------------------
这些部分中的每一个都必须有自己的行,其中包含该部分的开始和结束日期。我怎样才能写一个查询来完成这项工作?
另一种可能的解决方案:(感谢 John Eisbrener 提供的示例数据)
这有点笨拙,因为我无法让窗口函数(即DENSE_RANK、NTILE、RANK或ROW_NUMBER)像我希望的那样工作,所以我不得不通过COALESCE和表结构中的一些自定义来“设计”一个。
这里的基本前提是您首先需要将这些表连接到一个包含所有日期列表的中间表(例如,我创建的另一个表,名为#tmpDates)。这是报告输出的基础,因为我们将对记录进行分组以获得您指定的输出。然后我们在自定义窗口函数中工作(在这里使用 COALESCE),因此枚举了“维护”日和正常日之间的步骤,但为了使其正常工作,我必须在事件表中定义一个带有跳过增量值的标识字段.
下面是代码的所有可怕的荣耀。如果您有任何疑问,请告诉我,我会尽力澄清,但这是垃圾……工作垃圾。我希望有人可以使用排名功能来解决这个问题,而不是我使用 COALESCE 进行的糟糕的黑客攻击: