代码之家  ›  专栏  ›  技术社区  ›  Ricardo Castro

SQL Server:按序列号聚合

  •  0
  • Ricardo Castro  · 技术社区  · 7 年前

    我需要一些帮助来聚合一些数据。假设我有下表:

    number  Name    From Date   To Date     Sequency No_
    ----------------------------------------------------
    123440  MJCL    03/12/2014  02/09/2015  1
    123440  MJCL    07/09/2015  06/03/2016  1
    123440  MJCL    07/03/2016  06/09/2016  2
    123440  MJCL    07/09/2016  06/03/2017  3
    123440  MJCL    07/03/2017  31/12/9999  4
    123442  GJSVF   15/12/2014  14/06/2015  1
    123442  GJSVF   15/06/2015  14/12/2015  2
    123442  GJSVF   15/12/2015  14/06/2016  3
    123442  GJSVF   27/03/2017  26/03/2018  1
    

    我需要一个SQL查询来输出以下内容:

    number  Name    From Date   To Date
    --------------------------------------
    123440  MJCL    03/12/2014  02/09/2015
    123440  MJCL    07/09/2015  31/12/9999
    123442  GJSVF   15/12/2014  14/06/2016
    123442  GJSVF   27/03/2017  26/03/2018
    

    基本上我需要的是通过 [Sequency No_] 并返回 [From Date] 属于 [Sequency No_] = 1 以及 [To Date] 从上一个 [顺序编号] 序列的。有什么想法吗?

    请注意,数据库是SQL Server 2008。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Pரதீப்    7 年前

    这称为 gaps and islands 问题

    这里有一个技巧 Row_Number 窗口功能

    ;WITH cte
         AS (SELECT *,
                    Grp = Row_number()OVER(partition BY number ORDER BY [From Date],[Sequency No_]) - [Sequency No_]
             FROM   Yourtable)
    SELECT number,
           NAME,
           [From Date] = Min([From Date]),
           [To Date] = Max([To Date])
    FROM   cte
    GROUP  BY number,
              NAME,
              Grp 
    
        2
  •  0
  •   DeadCat    7 年前

    试试这个。。这将适用于您:)

    SELECT number,Name,MAX(From_Date) From_Date,MAX(To_Date) To_Date
    FROM   Trans_Tab
    GROUP BY number,Name
    
    UNION ALL
    
    SELECT number,Name,MIN(From_Date) From_Date,MIN(To_Date) To_Date
    FROM   Trans_Tab
    GROUP BY number,Name
    ORDER BY number,Name