SQL Server复杂DateDiff何处场景
这是我正在处理的当前表。我想记录站点(st)处于状态5的时间长度SQL Server复杂DateDiff何处场景,sql,sql-server,datediff,Sql,Sql Server,Datediff,这是我正在处理的当前表。我想记录站点(st)处于状态5的时间长度 +-----+-----+-----+-----+---------------------+ | st1 | st2 | st3 | st4 | TimeStamp | +-----+-----+-----+-----+---------------------+ | 3 | 3 | 3 | 3 | 2018-07-23 07:51:06 | +-----+-----+-----+-----+
+-----+-----+-----+-----+---------------------+
| st1 | st2 | st3 | st4 | TimeStamp |
+-----+-----+-----+-----+---------------------+
| 3 | 3 | 3 | 3 | 2018-07-23 07:51:06 |
+-----+-----+-----+-----+---------------------+
| 5 | 5 | 5 | 5 | 2018-07-23 07:50:00 |
+-----+-----+-----+-----+---------------------+
| 0 | 0 | 10 | 10 | 2018-07-23 07:47:19 |
+-----+-----+-----+-----+---------------------+
| 5 | 5 | 5 | 5 | 2018-07-23 07:39:07 |
+-----+-----+-----+-----+---------------------+
| 3 | 3 | 10 | 10 | 2018-07-23 07:37:48 |
+-----+-----+-----+-----+---------------------+
| 3 | 3 | 10 | 10 | 2018-07-23 07:37:16 |
+-----+-----+-----+-----+---------------------+
这是我想要的:
+-----+-----+-----+-----+---------------------+----------+
| st1 | st2 | st3 | st4 | TimeStamp | TimeDiff |
+-----+-----+-----+-----+---------------------+----------+
| 5 | 5 | 5 | 5 | 2018-07-23 07:50:00 | 66 |
+-----+-----+-----+-----+---------------------+----------+
| 5 | 5 | 5 | 5 | 2018-07-23 07:39:07 | 492 |
+-----+-----+-----+-----+---------------------+----------+
这可能是一个困难的方式去做这件事,所以我肯定是开放的其他想法。我的最终目标是能够每天提取一个查询并计算state5的时间总和。我的问题是从电台和它们各自的状态上的时间戳到我可以操纵和处理的时间长度。我还可以补充一点,因为当一个站点读取状态5时,这些数字会有一些变化,所以整行都会用数字5填充,而其他数字的行则用不同的数字填充
如果我有每个时间间隔的Datediff,我可以使用where子句将其缩小到状态5,这就是为什么我在最后一个表中有每个时间戳间隔的Datediff
任何帮助都将不胜感激。多谢各位
编辑
更多详细信息请参见下面的评论。您可以使用lead()
:
在添加where st1=5子句之后,我遇到了这个问题,datediff随后只给出了state 5实例之间的差异。你知道我该怎么做吗?我想计算state5的各个实例的长度。我现在将更新我的最终结果表来表示这一点。它将为我提供state=5的实例之间的datediff,而不是单个state 5实例的时间长度。@tphasley。这就是这个问题所要求的,用结果集明确地表示出来。我相信你已经问了另一个问题,这是正确的方法。只是澄清一下:对于最终结果,你想要653(所有状态5的第一个实例与第二个实例之间的秒数)?不653不是我想要的。我为我的最终结果制作了一个更详细的表格,它显示了我试图展示的内容。状态5实例期间经过的时间。
select t.*,
datediff(second, timestamp, lead(timestamp) over (order by timestamp)) as timediff
from t;