如何获得两行之间的差异

时间:2014-03-03 12:07:55

标签: sql sql-server-2008-r2

我们每隔一秒存储一次系统的实验数据。我们还存储Date-Time,system_ON_Status以及其他参数。根据一天的要求(可能是3-4次)打开系统。

现在我们需要生成查询以显示实验的开始和停止时间。

system_ON_Status字段在SQL中存储为布尔值。

对于ON为真,对于OFF为假。

由于

我们正在使用SQL SERVER 2008 R2

Date_Time                 System_ON_Status
2014-03-04 16:01:01:000     0
2014-03-04 16:01:02:000     0
2014-03-04 16:01:03:000     0
2014-03-04 16:01:04:000     0
2014-03-04 16:01:05:000     1
2014-03-04 16:01:06:000     1
2014-03-04 16:01:07:000     1
2014-03-04 16:01:08:000     1
2014-03-04 16:01:09:000     1
2014-03-04 16:01:10:000     0
2014-03-04 16:01:11:000     0
2014-03-04 16:01:12:000     1
2014-03-04 16:01:13:000     1
2014-03-04 16:01:14:000     1
2014-03-04 16:01:15:000     1
2014-03-04 16:01:16:000     0
2014-03-04 16:01:17:000     0
2014-03-04 16:01:18:000     0
2014-03-04 16:01:19:000     1
2014-03-04 16:01:20:000     1
2014-03-04 16:01:21:000     1
2014-03-04 16:01:22:000     1
2014-03-04 16:01:23:000     1
2014-03-04 16:01:24:000     1

输出必须是: 1)实验开始,即16:01:05:000 和实验结束16:01:09:000 系统运行:16:01:05:000-16:01:09:000之间的差异 4秒

2)实验开始,即16:01:12:000 和实验结束16:01:15:000 系统运行:16:01:05:000-16:01:09:000之间的差异 3秒

2)实验开始,即16:01:19:000 和实验结束16:01:24:000 系统运行:16:01:05:000-16:01:09:000之间的差异 5秒

1 个答案:

答案 0 :(得分:0)

以下查询为您提供每个实验的开始和结束时间。它包括system_on_status变回零的时间,因为这是实验结束的确认。在上一个实验的情况下,它还没有结束(system_on_status没有零)所以结束时间是NULL

SELECT  FromTime = MIN(D.log_date)
       ,X.ToTime
       ,D.system_on_status
FROM    Experiment_Log D
        OUTER APPLY ( SELECT TOP 1
                                ToTime = D2.log_date
                      FROM      Experiment_Log D2
                      WHERE     D.log_date < D2.log_date
                                AND D.[system_on_status] <> D2.[system_on_status]
                      ORDER BY  D2.log_date
                    ) X
WHERE   D.system_on_status = 1
GROUP BY X.ToTime
       ,D.system_on_status
ORDER BY FromTime;

为此输出数据:

FromTime             ToTime               system_on_status
2014-03-04 16:01:05  2014-03-04 16:01:10  1
2014-03-04 16:01:12  2014-03-04 16:01:16  1
2014-03-04 16:01:19  NULL                 1

我无法为此获得任何荣耀,我从this excellent answer接受了查询并将其修改为您的表格。因此,如果你想进行投票,请给ErikE代表! :)