如何在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