首页 > 解决方案 > SQL:获取同一列中的行之间的日期差异

问题描述

我正在尝试创建一个报告,这是我的输入数据。

  Stage  Name         Date
    1     x     12/05/2019 10:00:03
    1     x     12/05/2019 10:05:01
    1     y     12/06/2019 12:00:07
    2     x     12/06/2019 13:12:03
    2     x     12/06/2019 13:23:00
    1     y     12/08/2019 16:00:07
    2     x     12/09/2019 09:17:59  

这是我想要的输出。

  Stage  Name       DateFrom               DateTo            DateDiff
    1     x     12/05/2019 10:00:03    12/06/2019 12:00:07        1
    1     y     12/06/2019 12:00:07    12/06/2019 13:12:03        0
    2     x     12/06/2019 13:12:03    12/08/2019 16:00:07        2
    1     y     12/08/2019 16:00:07    12/09/2019 09:17:59        1

我不能在阶段和名称上使用 group by 子句,因为它会将我输入的第 3 行和第 6 行分组。我尝试将表连接到自身,但没有得到想要的结果。这在 SQL 中甚至可能吗?任何想法都会有所帮助。我正在使用 Microsoft SQL Server。

标签: sqlsql-servertsqlgaps-and-islands

解决方案


间隙和孤岛问题的变体,但它有一个非常简单的解决方案。

只需保留一行具有不同阶段或名称的每一行。然后用于lead()获取下一个日期。这是基本思想:

select t.stage, t.name, t.date as datefrom
       lead(t.date) over (order by t.date) as dateto,
       datediff(day, t.date, lead(t.date) over (order by t.date)) as diff
from (select t.*,
             lag(date) over (partition by stage, name order by date) as prev_sn_date,
             lag(date) over (order by date) as prev_date
      from t
     ) t
where prev_sn_date <> prev_date or prev_sn_date is null;

如果真的要过滤掉最后一行,还需要多一步;我不确定这是否可取。


推荐阅读