如何在SQL中实现链

我有一个出勤表,如下所示:

我试图将人们的出席(编码为 ABC、DEF 等)联系在一起。我希望最终结果如下所示:显示每个部分/出勤链的开始和结束日期。如果人 A 从 2021-01-01 到 2021-01-4 参加,那么它应该显示为一行,因为它是一个连续的链。我不知道该怎么做或从哪里开始。这是一种奇怪的出勤数据保存方式。

更多信息:我不知道这是否重要,但我最多有 20 列,因为我们的出席人数最多为 20 人。所以这取决于Col20。

回答

作为记录。最好以文本形式提供示例数据。

这是一个经典的峡湾和岛屿,有点扭曲。

在这里,我们通过一些 JSON 动态地对您的数据进行逆透视(实际上并未使用动态 SQL)。

示例或dbFiddle

;with cte as (
Select AttendanceDate
      ,B.*
      ,Grp = datediff(day,0,AttendanceDate) - dense_rank() over (partition by value order by AttendanceDate)
 From  YourTable A
 Cross Apply (
                Select [Key]
                      ,Value
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper )) 
                 Where [Key] not in ('AttendanceDate')
             ) B
)
Select [Value]
      ,[Start]  = min(AttendanceDate)
      ,[End]    = max(AttendanceDate)
 From  cte
 Group By Value,Grp

退货

Value   Start       End
ABC     2021-01-01  2021-01-04
DEF     2021-01-01  2021-01-03
GH      2021-01-02  2021-01-05
DEF     2021-01-07  2021-01-08
xx      2021-01-08  2021-01-10
zz      2021-01-08  2021-01-08


以上是如何在SQL中实现链的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>