Where 子句更改了我的 datediff 列的结果,我该如何解决这个问题?

Where clause changing the results of my datediff column, How can I work around this?

我正在尝试获取 st1=5 时经过的时间。这是我目前拥有的,它为我提供了每次状态更改的 datediff 时间。我的问题是,当我添加 where st1=5 子句时,datediff 显示状态 = 5 的实例之间的时间差异,而不是状态为 5 时经过的时间。

select timestamp,st1,st2,st3,st4,
  datediff(second, timestamp, lead(timestamp) 
    over (order by timestamp)) as timediff
from A6K_status
Order By Timestamp DESC


+-----+-----+-----+-----+---------------------+----------+
| st1 | st2 | st3 | st4 | TimeStamp           | TimeDiff |
+-----+-----+-----+-----+---------------------+----------+
| 3   | 3   | 3   | 3   | 2018-07-23 07:51:06 |          |
+-----+-----+-----+-----+---------------------+----------+
| 5   | 5   | 5   | 5   | 2018-07-23 07:50:00 | 66       |
+-----+-----+-----+-----+---------------------+----------+
| 0   | 0   | 10  | 10  | 2018-07-23 07:47:19 | 161      |
+-----+-----+-----+-----+---------------------+----------+
| 5   | 5   | 5   | 5   | 2018-07-23 07:39:07 | 492      |
+-----+-----+-----+-----+---------------------+----------+
| 3   | 3   | 10  | 10  | 2018-07-23 07:37:48 | 79       |
+-----+-----+-----+-----+---------------------+----------+
| 3   | 3   | 10  | 10  | 2018-07-23 07:37:16 | 32       |
+-----+-----+-----+-----+---------------------+----------+

我正在尝试对 station1 的状态为 5 的时间求和。从上面的 table(我现在所拥有的)来看,如果我可以对 st1=5 的 timediff 求和,那将完美地工作。但是通过将 "where st1=5" 添加到我的查询中,我得到了 state = 5.

实例之间的时差

如有任何帮助,我们将不胜感激。我觉得非常接近我想要达到的结果。谢谢。

编辑 这就是我想要实现的

+-----+------------+----------+
| st1 | TimeStamp  | TimeDiff |
+-----+------------+----------+
| 5   | 2018-07-23 | 558      |
+-----+------------+----------+

假设 SQL 服务器,尝试这样的事情:

WITH SourceTable AS (
select TOP 100 PERCENT timestamp,st1,st2,st3,st4,
  datediff(second, timestamp, lead(timestamp) 
    over (order by timestamp)) as timediff
from A6K_status
Order By Timestamp DESC
)
SELECT SUM(timediff) as totaltimediff
WHERE st1 = 5

您将使用子查询(或 CTE):

select sum(timediff)
from (select timestamp, st1, st2, st3, st4,
             datediff(second, timestamp, lead(timestamp) over (order by timestamp)) as timediff
      from A6K_status
     ) s
where st1 = 5;