需要根据 T-SQL 中准入日期列计算出的第一个“3 个月”,为列中的每个值添加 3 个月

2023-12-06

我有 14K 记录表,如下所示(与一个特定 client_id = 1002 相关的数据示例): (我的日期格式是 mm/dd/yyyy,月份在前)

ClientsEpisodes:

      client_id      adm_date      disch_date    
          1002      3/11/2005        5/2/2005
          1002      8/30/2005       2/16/2007
          1002      3/16/2017            NULL

在 SQL Server (T-SQL) 中 - 我需要在新列 [3Month Date] 中计算 + 3 个月的日期,其中第一个“+ 3 个月”值将根据我现有的 [adm_date] 列计算。然后,+ 3 个月应添加到 [3Months Date] 中的值,然后接下来的 3 个月应添加到 [3Months Date] 列中的下一个值,依此类推...,直到 [3MonthsDate]

这是我期望看到的结果: (我用不同的颜色突出显示了日期偏移,以便更好地查看)

enter image description here

下面,我将通过更详细的解释来澄清每个填充(或未填充)的数据集:

ClientsEpisode 表中的第一个 [adm_date] 是 3/11/2005。 加3个月: 3/11/2005 + 3 个月 = 6/11/2005 - 落在初始 [disch_date] (5/2/2005) 之后 - 未填充

   Next [adm_date] from ClientEpisode is 8/3/2005 + 3 Months = 11/30/2005; 
        then + 3 months must be added to 11/30/2005 = 2/30/2006; 
        then 2/30/2006 + 3 months = 5/30/2006; 
        then 5/30/2006 + 3 months = 8/30/2006; 
        then 8/30/2006 + 3 months = 11/30/2006;
        then 11/30/2006 + 3 months = 3/2/2007 - falls AFTER my [disch_date] 
                                                      (2/16/2007) - not populated

下一个 [adm_date] - [disch_date] 设置为 11/5/2007-2/7/2009(深蓝色)的相同算法。

然后,其中 [adm_date] = 3/16/17,我有 [disch_date] IS NULL,因此,该算法适用直到 [3 个月日期]


您可以使用recursive common expression。下面是一个例子。请注意,您可以更改DATEADD与其他部分(例如,如果您愿意,可以添加 90 天)- 这是业务逻辑问题。

DECLARE @DataSource TABLE
(
    [client_id] INT
   ,[adm_date] DATE
   ,[disch_date] DATE
);

INSERT INTO @DataSource ([client_id], [adm_date], [disch_date])
VALUES (1002, '3/11/2005 ', '5/2/2005')
      ,(1002, '8/30/2005 ', '2/16/2007')
      ,(1002, '3/16/2017 ', NULL);

WITH DataSource AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY [client_id]) AS [row_id]
          ,[client_id]
          ,[adm_date]
          ,DATEADD(MONTH, 3, [adm_date]) AS [3Month Date]
          ,ISNULL([disch_date], GETUTCDATE()) AS [disch_date]
    FROM @DataSource
    WHERE DATEADD(MONTH, 3, [adm_date]) <= ISNULL([disch_date], GETUTCDATE()) 
),
RecursiveDataSource AS
(
    SELECT [row_id]
          ,[client_id]
          ,[adm_date]
          ,[3Month Date]
          ,[disch_date]
          ,0 AS [level]
    FROM DataSource
    UNION ALL
    SELECT DS.[row_id]
          ,DS.[client_id]
          ,DS.[adm_date]
          ,DATEADD(MONTH, 3, RDS.[3Month Date])
          ,DS.[disch_date]
          ,[level] + 1
    FROM RecursiveDataSource RDS
    INNER JOIN DataSource DS
        ON RDS.[row_id] = DS.[row_id]
        AND DATEADD(MONTH, 3, RDS.[3Month Date]) < DS.[disch_date]
)
SELECT *
FROM RecursiveDataSource
ORDER BY [row_id]
        ,[level];
    
        
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要根据 T-SQL 中准入日期列计算出的第一个“3 个月”,为列中的每个值添加 3 个月 的相关文章

随机推荐