如何根据 T-SQL (SSMS 2017) 中的下一条记录 [Effective Date]-1 计算到期日期?

Posted

技术标签:

【中文标题】如何根据 T-SQL (SSMS 2017) 中的下一条记录 [Effective Date]-1 计算到期日期?【英文标题】:How to calculate expiration date based on next record's [EffectiveDate]-1 in T-SQL (SSMS 2017)? 【发布时间】:2020-04-10 22:37:42 【问题描述】:

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

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

    FROM
         [Medications]

结果表:

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

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

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

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

请帮忙提出任何建议

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

谢谢!

【问题讨论】:

【参考方案1】:
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;

【讨论】:

谢谢你,我会试试的,看起来这行得通:)

以上是关于如何根据 T-SQL (SSMS 2017) 中的下一条记录 [Effective Date]-1 计算到期日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SSMS 的块中分隔 SQL 代码?

T-SQL 中的 RaiseError 命令

T-SQL查询语句

如何编写转换为 T-SQL 的 EF Core 查询包含

如何防止 SSMS 在“查找”文件中的查找和替换发生更改

使用T-SQL语句插入更新删除数据表