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
或创建日期???