我有一个表,随着时间的推移将一个 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(开始)错过了第二次 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
关于sql - 从年度条目创建范围映射记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650431/