sql - 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。
解决方案
这是间隙和孤岛问题的变体,但它有一个非常简单的解决方案。
只需保留前一行具有不同阶段或名称的每一行。然后用于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;
如果真的要过滤掉最后一行,还需要多一步;我不确定这是否可取。
推荐阅读
- python - Python 3.7 与 Python 2.7 正则表达式匹配行为
- symfony - GosWebSocketBundle 中对 websocket 的 JWT 令牌认证
- ruby-on-rails - 查看 Rails 中加载的视图的统计信息
- import - Q# 中如何使用写在另一个文件中的操作?
- filter - SUMX 带 2 个过滤器 Q
- python-3.x - 打印右对齐的二进制数列表
- laravel - 在 Laravel 中嵌套多对多关系
- c# - 使用 FFMPEG / FFMediaElement (FFME) 在 WPF 应用程序中以低延迟播放 RTSP
- android - 忽略 navigate() 调用:FragmentManager 已经保存了它的状态
- python - 优化 Python 算法