【问题标题】:How to achieve chains in SQLSQL中如何实现链
【发布时间】:2021-03-26 01:19:36
【问题描述】:

我有一张考勤表,如下所示:

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

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

【问题讨论】:

  • 在此处发布问题之前,您需要先尝试一下并展示您的尝试。

标签: sql sql-server sql-server-2016 common-table-expression


【解决方案1】:

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

这是一个带有一点转折的经典间隙和岛屿。

在这里,我们通过一些 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

【讨论】:

  • 非常感谢您的回答。我会尽快尝试,但我不能在 SSMS 中运行它?我必须使用 JSON 吗? (对不起,如果问题很愚蠢)
  • @PowerBIBeginner 是的,你可以运行这是 SSMS(我做过)。 JSON 部分需要 SQL Server 2016+。你运行的是什么版本?
  • @PowerBIBeginner 查看编辑。我去掉了演示表变量
  • SSMS 2017,这非常有效。再次非常感谢。我需要真正分析它才能完全理解它。但老实说,我花了 2-3 个小时,却什么也想不出来。
  • 最后一个问题:您是否使用 JSON 是因为我们不知道最终可能有多少列?现在我有 20 列,但它可以更改为 25,这就是你使用 JSON 的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多