Мне нужна помощь, чтобы собрать некоторые данные. Представьте, что у меня есть следующая таблица:

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] из последнего [Sequency No_] в последовательности. Любые идеи?

Обратите внимание, что это база данных SQL Server 2008.

0
Ricardo Castro 2 Янв 2018 в 19:36

2 ответа

Лучший ответ

Это называется пробелы и островки .

Вот один трюк с использованием оконной функции 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 
1
Pரதீப் 2 Янв 2018 в 17:02

Попробуйте ... это сработает для вас :)

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
0
DeadCat 3 Янв 2018 в 10:08