Где пункт, изменяющий результаты моего столбца датированных слов, Как я могу обойти это?

Я пытаюсь получить истекшее время, пока st1=5. Вот то, что у меня есть в настоящее время, и дает мне время для каждого изменения состояния. Моя проблема заключается в том, что, когда я добавляю предложение where st1=5, датировка показывает разницу во времени между случаями, когда состояние = 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       |
+-----+-----+-----+-----+---------------------+----------+

Я пытаюсь суммировать время, когда состояние станции 1 равно 5. Из этой таблицы выше (что у меня есть сейчас), если бы я мог просто суммировать timediff, где st1 = 5, это будет работать идеально. Но добавление "где st1=5" к моему запросу дает мне разницу во времени между случаями, когда состояние = 5.

Любая помощь приветствуется. Я чувствую себя очень близко к результату, которого хотел бы достичь. Спасибо вам.

Редактировать Это то, чего я хотел бы достичь

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

2 ответа

Решение

Вы бы использовали подзапрос (или 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;

Предполагая SQL Server, попробуйте что-то вроде этого:

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
Другие вопросы по тегам