我有一个表,随着时间的推移将一个id映射到一个相关id(associd),并且数据库每年都有一个记录。我想把这张桌子上卷起来,每一段交往都有一个记录。
当前示例:

    ID AssocID Start End
    1  a       2000  2001
    1  a       2001  2002
    1  b       2002  2003
    1  b       2003  2004
    1  a       2004  2005
    ...
    1  a       2017  2018
    2  c       2000  2001
    2  c       2001  2002
    2  d       2002  2003
    ...
    2  d       2017  2018

我想让它看起来更像这样:
    ID AssocID Start End
    1  a       2000  2002
    1  b       2002  2004
    1  a       2004  2018
    2  c       2000  2002
    2  d       2002  2018

我的主要问题是,id“1”在一段时间后返回associd“a”,使用distinct(id,associd)和min(start)将错过id“1”映射到associd“a”的第二次
感谢任何帮助:)

最佳答案

你可以用这个。

 -- Sample Data

 DECLARE @MyTable TABLE (ID INT, AssocID VARCHAR(10),  Start INT, [End] INT)
 INSERT INTO @MyTable VALUES
(1, 'a', 2000, 2001),
(1, 'a', 2001, 2002),
(1, 'b', 2002, 2003),
(1, 'b', 2003, 2004),
(1, 'a', 2004, 2005),
(1, 'a', 2017, 2018),
(2, 'c', 2000, 2001),
(2, 'c', 2001, 2002),
(2, 'd', 2002, 2003),
(2, 'd', 2017, 2018)

-- Query

SELECT ID, AssocID, MIN(Start) [Start], MAX([End]) [End] FROM
    ( SELECT *,
        GRP = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Start) - ROW_NUMBER() OVER(PARTITION BY ID, AssocID ORDER BY Start)
     FROM @MyTable ) T
GROUP BY ID, AssocID, GRP
ORDER BY ID,  [Start]

结果:
ID          AssocID    Start       End
----------- ---------- ----------- -----------
1           a          2000        2002
1           b          2002        2004
1           a          2004        2018
2           c          2000        2002
2           d          2002        2018

10-06 01:36