2015-11-03 4 views
1

Я пробовал искать это, но ничего не соответствовало тому, что я искал, поэтому любая помощь приветствуется!sql server date range на основе предыдущих записей строки

У меня есть таблица, как показано ниже:

+-----------+---------------+-------+------------+ 
| Policy_NO | Creation_Date | Limit | Limit_Date | 
+-----------+---------------+-------+------------+ 
| A00001 | 8/31/2015  | 1000 | 8/31/2015 | 
| A00001 | 8/31/2015  | 2000 | 9/30/2015 | 
| A00001 | 8/31/2015  | 5000 | 10/22/2015 | 
| A00001 | 8/31/2015  | 500 | 11/17/2015 | 
| A00003 | 9/21/2015  | 3000 | 1/1/2016 | 
+-----------+---------------+-------+------------+ 

И то, что я хочу, чтобы иметь «End_Limit_Date», который должен быть либо дата следующего предела, с тем же номером политики -1 или точно один год со дня создания.

Например, приведенная выше таблица должна быть:

+------------------------------------------------+----------------+ 
| Policy_NO Creation_Date Limit Limit_Date | End_Limit_Date | 
+------------------------------------------------+----------------+ 
| A00001  8/31/2015  1000 8/31/2015  | 9/29/2015  | 
| A00001  8/31/2015  2000 9/30/2015  | 10/21/2015  | 
| A00001  8/31/2015  5000 10/22/2015 | 11/16/2015  | 
| A00001  8/31/2015  500 11/17/2015 | 8/31/2016  | 
| A00003  9/21/2015  3000 1/1/2016  | 9/21/2016  | 
+------------------------------------------------+----------------+ 

я только доступ только для чтения, так что «обновление запросов» и «создать новую таблицу» запросы не применяются для моего случая ...

Заранее благодарим за помощь!

ответ

1

Если у вас есть SQL Server 2012 или более поздней версии вы можете использовать LEAD(), чтобы получить следующую строку:

SELECT t.Policy_NO, 
     t.Creation_Date, 
     t.Limit, 
     t.Limit_Date, 
     End_Limit_Date = ISNULL(
          DATEADD(DAY, -1, LEAD(t.Limit_Date) OVER(PARTITION BY t.Policy_NO 
                    ORDER BY t.Limit_Date)), 
          DATEADD(YEAR, 1, t.Creation_Date)) 
FROM dbo.T; 

Если нет, то вам нужно коррелированный подзапрос:

SELECT t.Policy_NO, 
     t.Creation_Date, 
     t.Limit, 
     t.Limit_Date, 
     End_Limit_Date = ISNULL(
          DATEADD(DAY, -1, t2.Limit_Date), 
          DATEADD(YEAR, 1, t.Creation_Date)) 
FROM dbo.T 
     OUTER APPLY 
     ( SELECT TOP 1 t2.Limit_Date 
      FROM dbo.T AS t2 
      WHERE t2.Policy_NO = t.Policy_NO 
      AND  t2.Limit_Date > t.Limit_Date 
      ORDER BY t2.Limit_Date 
     ) AS t2; 
+0

Спасибо! именно то, что мне нужно. – Farellia

+0

@Farellia Вы подтвердили решение? Запрашивая, потому что я выполнил запрос @GarethD, а End_Limit_Date для A00003 дает '2016-09-21' вместо' 2017-01-01' – CM2K

+0

Да, единственное, что отсутствует, это часть 1Y, но это та часть, которую я могу фигурировать вне. – Farellia

Смежные вопросы