2015-11-03 56 views
1

我試過搜索這個,但沒有什麼真正符合我所尋找的,所以任何幫助表示讚賞!基於前一行條目的sql服務器日期範圍

我有一個表像下面:

+-----------+---------------+-------+------------+ 
| 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的查詢和A00003的End_Limit_Date產生'2016-09-21'而不是'2017-01-01' – CM2K

+0

是的,唯一缺少的是1Y部分,但這是我可以計算的部分出。 – Farellia