【问题标题】:Create start and end date from single date column从单个日期列创建开始和结束日期
【发布时间】:2017-06-09 20:06:07
【问题描述】:

输入:

Id |Status  |Modified_date
-----------------------------------------
1  |active  |20-10-2016   
1  |removed |09-11-2016    
2  |active  |21-10-2016    
2  |removed |11-01-2017

我想将开始日期和结束日期添加为新列,输出应如下所示

ID       | status   | start_Date  | end_date
-----------------------------------------
1/1/1900 | active   | 20-10-2016  |9/11/2016             
1/1/1900 | removed  | 9/11/2016   |99-99-9999
1/2/1900 | active   | 21-10-2016  |11/1/2017    
1/2/1900 | removed  | 11/1/2017   |99-99-9999

请告诉我这是怎么可能的

【问题讨论】:

  • 不到一个小时前,我刚刚为这种确切情况提供了答案。 stackoverflow.com/questions/44437174/…
  • @SeanLange 我认为现在有点不同 = ) 但与你所做的有一些共同点。
  • 结束日期最好使用 NULL,而不是全部 9。所有 9 的存在和格式也让我想知道这些是否是 varchar 列。如果是这种情况,您真的应该将其转换为 DateTime 列。在比较日期方面,您所使用的格式很难在 SQL 代码中正确处理。
  • 另外,在结果中,该日期值真的是您想要的 ID 吗?

标签: sql-server


【解决方案1】:

简单的OUTER APPLY 应该做的事情:

SELECT  c.id,
        c.[status],
        c.[Modified_date] as [start_date],
        COALESCE(t.[Modified_date],'99-99-9999') as end_date --or ISNULL
FROM YourTable c
OUTER APPLY (
    SELECT TOP 1 [Modified_date]
    FROM YourTable 
    WHERE ID = c.ID AND [Modified_date] > c.[Modified_date]
    ) as t

输出:

id          status  start_date end_date
----------- ------- ---------- ----------
1           active  20-10-2016 09-11-2016
1           removed 09-11-2016 99-99-9999
2           active  21-10-2016 11-01-2017
2           removed 11-01-2017 99-99-9999

或使用LEAD(从 SQL Server 2012 开始):

SELECT  id,
        [status],
        [Modified_date] as [start_date],
        LEAD([Modified_date],1,'99-99-9999') OVER (PARTITION BY Id ORDER BY [Modified_date] DESC) as end_date
FROM YourTable 

【讨论】:

  • 非常感谢您的回答@gofr1 我尝试了代码,不幸的是它没有按我的预期工作。因为,ID 的记录比我预期的要多。以下是输入的患者 ID |状态|类型|修改日期 ----------------- 1 |已删除 |HHH |08/07/2015 1 |已删除 |HHH |08/07 /2017 1 |已删除 |HHH |08/07/2018 2 |已删除 |HHH |08/07/2015 2 |有效 |护士 |08/09/2016 2 |有效 |基础 |09/09/2016 3 |已删除 | HHH |08/06/2017 3 |已删除 |HHH |08/07/2017
  • 那么你必须改变你的问题。 :)
  • 查看答案! LEAD 部分工作正常,我修复了 OUTER APPLY 部分。
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 2022-01-25
  • 2021-06-20
  • 2021-08-22
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多