Sql server 基于上一行条目的sql server日期范围

Sql server 基于上一行条目的sql server日期范围,sql-server,Sql Server,我已经试着搜索了这个,但是没有任何东西真正符合我所寻找的,所以任何帮助都是感激的 我有一张如下的桌子: +-----------+---------------+-------+------------+ | Policy_NO | Creation_Date | Limit | Limit_Date | +-----------+---------------+-------+------------+ | A00001 | 8/31/2015 | 1000 | 8

我已经试着搜索了这个,但是没有任何东西真正符合我所寻找的,所以任何帮助都是感激的

我有一张如下的桌子:

+-----------+---------------+-------+------------+  
| 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   |  
+-----------+---------------+-------+------------+
我想要的是有一个“结束限制日期”,它应该是下一个限制的日期,具有相同的保单编号-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      |
+------------------------------------------------+----------------+
我只有只读访问权限,因此“更新查询”和“创建新表”查询不适用于我的案例


提前感谢您的帮助

如果您有SQL Server 2012或更高版本,则可以使用获取下一行:

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;

非常感谢。正是我需要的。@Farellia你验证了解决方案了吗?询问是因为我运行了@GarethD的查询,A00003的结束限制日期是
2016-09-21
而不是
2017-01-01
是的,唯一缺少的是1Y部分,但这是我能找到的部分。@CM2K在我看来,这就像样本数据中的一个错误,简短的内容是“从创建日期算起整整一年。”,A00003的创建日期为
2015-09-21
,因此我预计结束日期为
2016-09-21
。在样本数据中,它似乎将限制日期增加了1年,但
A00001
的情况并非如此。所以我不得不假设描述是正确的,而样本数据是错误的。@Gareth如果你的描述是正确的,我是错误的,但也许你可以澄清一下。
End\u Limit
是否用于A00003的
End\u Limit\u Date
或创建日期???