t-sql从按其他列分组的日期平面列表中汇总日期范围

t-sql从按其他列分组的日期平面列表中汇总日期范围,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,假设我有下表: UserId AttributeId DateStart 1 3 1/1/2020 1 4 1/9/2020 1 3 2/2/2020 2 3 3/5/2020 2 3 4/1/2020 2 3 5/1/2020 对于每个唯一的UserId/At

假设我有下表:

UserId   AttributeId   DateStart
1        3             1/1/2020
1        4             1/9/2020
1        3             2/2/2020
2        3             3/5/2020
2        3             4/1/2020
2        3             5/1/2020
对于每个唯一的UserId/AttributeId对,假定DateEnd是该对的下一个DateStart的前一天,否则它为null,或者是一些默认值,比如说在未来的12/31/3000

将此操作应用于上表将产生:

UserId   AttributeId   DateStart     DateEnd
1        3             1/1/2020      2/1/2020
1        4             1/9/2020      <null>
1        3             2/2/2020      <null>
2        3             3/5/2020      3/31/2020
2        3             4/1/2020      4/30/2020
2        3             5/1/2020      <null>
在SQL Server 2008 R2中执行的哪个T-SQL可以实现这一点?

您正在描述的lead:

我已更改查询

请试试这个:

  SELECT 
  UserId,AttributeId,DateStart,Min(DateEnd)DateEnd
  FROM
  (
 
   SELECT X.UserId,X.AttributeId,X.DateStart, DATEADD(DD,-1,Y.DateStart) DateEnd
   FROM TAB X LEFT JOIN TAB Y
   ON (X.UserId=Y.UserId) AND (X.AttributeId=Y.AttributeId)
   AND   (X.DateStart<Y.DateStart) 

  )
 T
 GROUP BY UserId,AttributeId,DateStart
 ORDER BY DateStart

抱歉…我应该声明我需要这个在SQL 2008 R2中工作!为什么要使用不受支持的SQL Server版本?非常感谢您发布的答案!我认为如果同一个UserId/AttributeId组合在表中有3个或更多的条目,那么这将不起作用。我修改了我的问题来展示一个例子——请看最后一行是新的。我已经更改了查询,请检查它的FUN28,告诉我,你尝试过查询吗?
  SELECT 
  UserId,AttributeId,DateStart,Min(DateEnd)DateEnd
  FROM
  (
 
   SELECT X.UserId,X.AttributeId,X.DateStart, DATEADD(DD,-1,Y.DateStart) DateEnd
   FROM TAB X LEFT JOIN TAB Y
   ON (X.UserId=Y.UserId) AND (X.AttributeId=Y.AttributeId)
   AND   (X.DateStart<Y.DateStart) 

  )
 T
 GROUP BY UserId,AttributeId,DateStart
 ORDER BY DateStart