我有一份出席名单如下:

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

更多信息:我不知道这是否重要,但我有多达20个专栏,因为我们的出席人数最多是20人。所以这取决于Col20。
发布于 2021-03-26 01:57:09
记录在案。最好以文本形式提供样本数据。
这是一个典型的空隙和岛屿,有点扭曲。
在这里,我们通过一些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-08https://stackoverflow.com/questions/66809745
复制相似问题