0

我一直在为以下问题而烦恼。我有一个带有标识符、特征以及开始和结束日期的表。通常,在间隔结束时,特性应该改变。但是,由于系统中的故障,会创建具有相同特征的连续间隔。例子 :

    ID 特征 开始日期 结束日期
    1 个               2012/06/25    2012/12/11
    1 a 2012/12/11    2013/06/24 
    1 b                2013/06/24    2013/11/27 
    1 a                2013/11/27    2013/12/10
    1 个 2013/12/10 2014/01/21
    1 a 2014/01/21    2014/06/15 
    1 c                2014/06/15    2014/09/10
    1 c    2014/09/11 2999/12/31

我想查看每组 id&characteristics 的最大(结束日期)。但是该组应该只在连续的时间范围内保持一个组。就像是:

ID  Characteristic  Start Date  End Date
1   a               2012/06/25  2013/06/24
1   b               2013/06/24  2013/11/27
1   a               2013/11/27  2014/06/15
1   c               2014/06/15  2999/12/31

我一直在搞乱FIRST_VALUELEADLAG我似乎无法弄清楚。

4

1 回答 1

0

我不确定这是不是最好的方法,但它适用于您上面给出的数据样本。我将这些值插入到一个名为 #tmp 的表中,因此您需要将其替换为您的表名。还可以根据需要替换 StartDate 和 EndDate 列名。

SELECT ID, Characteristic, MinStartDate, MaxEndDate
  FROM ( 
    SELECT
        ID,
        Characteristic,
        ISNULL(
            (SELECT MAX(B.EndDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic <> A.Characteristic AND B.Row < A.Row)
        ,
            (SELECT MIN(B.StartDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic = A.Characteristic AND B.Row <= A.Row)
        ) AS 'MinStartDate',
        ISNULL(
            (SELECT MIN(B.StartDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic <> A.Characteristic AND B.Row > A.Row)
        ,
            (SELECT MAX(B.EndDate) FROM (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) AS B WHERE B.Characteristic = A.Characteristic AND B.Row >= A.Row)
        ) AS 'MaxEndDate'
    FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS 'Row', * FROM #tmp) as A
    ) AS Sub
GROUP BY ID, Characteristic, MinStartDate, MaxEndDate
ORDER BY MinStartDate
于 2015-01-23T13:31:59.120 回答