首页 > 解决方案 > 如何根据 T-SQL (SSMS 2017) 中下一条记录的 [EffectiveDate]-1 计算到期日期?

问题描述

我有以下简单查询和结果表:

    SELECT 
          [Client_ID],
          [ClientName],
          [EffectiveDate],
          [MedConditionID],
          [MedCondition]

    FROM
         [Medications]

结果表:

在此处输入图像描述

我需要填充 [ExpirationDate] 字段 - 它基于下一条记录的 [EffectiveDate] 字段 - 1。

例如 - 如果生效日期是 '1/16/2019'、'10/16/2019',那么 '1/16/2019' 的 [ExpirationDate] = '10/15/2019' 等。

对于最大生效日期(在此表中为 '3/18/2020'),到期日期应始终为 = '2050/12/31'

请参阅下面的更新表(我需要如何填充 [ExpirationDate],我突出显示了第一个 2 个示例):

在此处输入图像描述

请帮忙提出任何建议

我在考虑一些 Lag() / Lead() 函数,它们将相互比较记录,但不确定

谢谢!

标签: sql-serverdatecalculated-field

解决方案


declare @Medications table
(
[Client_ID] int,
[ClientName] varchar(50),
[EffectiveDate] date,
[MedConditionID] int,
[MedCondition] varchar(50)
);


insert into @Medications(Client_Id, ClientName, EffectiveDate, MedConditionId, MedCondition)
values
(100, 'jeffrey', '20190116', 123, 'Alcohol'),
(100, 'jeffrey', '20191016', 123, 'Alcohol'),
(100, 'jeffrey', '20191016', 267, 'Head'),
(100, 'jeffrey', '20191220', 123, 'Alcohol'),
(100, 'jeffrey', '20191220', 267, 'Head'),
(100, 'jeffrey', '20200121', 123, 'Alcohol'),
(100, 'jeffrey', '20200121', 267, 'Head');


select EffectiveDate, 
    dateadd(day, -1,
    lead(EffectiveDate, 1, '20510101' ) over(partition by Client_id, MedConditionId order by EffectiveDate)
    ) as ExpirationDate,
    *
from @Medications;

推荐阅读