我正在尝试编写一些将假期分组在一起的代码,并为每个分组创建一个唯一的ID。我遇到的麻烦是创建团体,以知道他们属于一起。如何识别连续工作日期?
默认情况下,如果有人要求一个星期关闭5天将得到一个特定的ID(即223)。因此,会有ID 223的5天假期实例,我可以轻松获得开始和结束日期。但如果有人决定预订星期五休息(ID 224),然后要求星期三和星期四休息(ID 228),然后要求下一个星期一休息(ID 230),那么我有3个独立的实际实际情况一个假期,这里是我需要将它们组合在一起而忽略周末的地方。
我试过DENSE_RANK OVER PARTION
和ROW_NUMBER OVER ORDER
的变体,但是我无法得到它返回我需要的数字。
样本数据和期望的输出
SELECT '01-March-2017' AS HolidayDate, DATEPART(WK,'01-March-2017') AS Dw, 223 AS ID_Field, 1000 AS HolidayID
UNION ALL
SELECT '02-March-2017' AS HolidayDate, DATEPART(WK,'02-March-2017') AS Dw, 223, 1000
UNION ALL
SELECT '03-March-2017' AS HolidayDate, DATEPART(WK,'03-March-2017') AS Dw, 223, 1000
UNION ALL
SELECT '24-March-2017' AS HolidayDate, DATEPART(WK,'24-March-2017') AS Dw, 230 , 1001
UNION ALL
SELECT '27-March-2017' AS HolidayDate, DATEPART(WK,'27-March-2017') AS Dw, 235, 1001
UNION ALL
SELECT '20-Sep-2017' AS HolidayDate, DATEPART(WK,'20-Sep-2017') AS Dw, 224, 1002
UNION ALL
SELECT '27-Sep-2017' AS HolidayDate, DATEPART(WK,'27-Sep-2017') AS Dw, 228, 1003
所以上面创建一个例子,节假日ID是所需的列输出(随机选择用于样品编号)。 ID字段是假期请求提交时生成的编号。
正如你所看到的223请求进来完成,并具有相同的ID,所以我可以选择MAX(日期),并通过ID_Field得到所需的结果分组。
230和235分别进来但是是同一个假期(作为一个连续的假期),所以我需要将它们用相同的ID进行分组。
最后225和228是完全独立的请求,所以需要唯一的号码。与答案
请尝试创建http://sqlfiddle.com/案例。 – Anil
3月24日和27日不是连续的日期。请解释你如何知道哪些日子是“相邻的”。你如何考虑假期? –
@GordonLinoff他们是连续工作日 – GPH