sql - 从年度条目创建范围映射记录

标签 sql sql-server database

我有一个表,随着时间的推移将一个 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/

相关文章:

mysql - SQL - 现在()+ 10 天

php - 需要输入动态查询输出脚本

sql - 单元格中带有空格的 SQL Server 中的数据透视表

sql - 是否可以找出 SQL Server 中有多少数据库数据早于 N 年?

mysql - 在此 SQL 查询中 Tmp(email) 有什么用?

sql - 当在很多地方使用 GETDATE() 时,使用变量是不是更好?

sql-server - Sql Server 谓词惰性?

sql-server - 获取一个月中的天数 - mdx

MySQL 查询优化 - 现有查询运行速度太慢

sql - 您可以在 select 命令中创建一个 case 语句来评估两个不同的表字段吗?