Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从同一列中拆分时间并存储到两列中,然后在sql中查找这两列之间的差异_Sql_Sql Server - Fatal编程技术网

从同一列中拆分时间并存储到两列中,然后在sql中查找这两列之间的差异

从同一列中拆分时间并存储到两列中,然后在sql中查找这两列之间的差异,sql,sql-server,Sql,Sql Server,从同一列中拆分时间并存储到两列中,然后在sql server中查找这两列之间的差异 select SourceName,Active,EventTimeStamp, case when Active=1 then EventTimeStamp END as ActiveTime, case when Active=0 then EventTimeStamp END as InactiveTime from dbo.AllEvent where SourceName='R2_20' order

从同一列中拆分时间并存储到两列中,然后在sql server中查找这两列之间的差异

select SourceName,Active,EventTimeStamp,
case when Active=1
then EventTimeStamp END as ActiveTime,

case when Active=0
then EventTimeStamp END as InactiveTime

from dbo.AllEvent
where SourceName='R2_20'
order by SourceName 
;


sname   active  EventTimeStamp      Active      Inavtive
R2_20       1   14:51.9     14:51.9     NULL
R2_20       0   14:53.9     NULL        14:53.9
R2_20       1   15:05.9     15:05.9     NULL
R2_20       0   15:07.9     NULL        15:07.9
R2_20       1   15:15.9     15:15.9     NULL
R2_20       0   15:17.9     NULL        15:17.9
R2_20       1   15:26.0     15:26.0     NULL
R2_20       0   15:28.0     NULL        15:28.0
R2_20       1   15:36.0     15:36.0     NULL
R2_20       0   15:38.0     NULL        15:38.0

如果您使用的SQL Server版本支持此功能,请使用它。但这只是根据你提供的数据我的猜测

SELECT
  SourceName sname,
  Active active,
  EventTimeStamp start,
  [end],
  DATEDIFF(millisecond, EventTimeStamp, [end]) difference
FROM (
  SELECT
    *,
    LEAD(EventTimeStamp)
      OVER (PARTITION BY SourceName
            ORDER BY EventTimeStamp, Active DESC) [end]
  FROM AllEvents
) t
WHERE Active = 1;
但对于更复杂的数据集,以下查询可能更可取

WITH
  AllEvents AS (
    SELECT
      sn SourceName,
      CAST(a as INT) Active,
      CAST(ts as TIME) EventTimeStamp
    FROM (VALUES
      ('R2_20', 1, '00:14:51.9'),
      ('R2_20', 1, '00:14:52.9'),
      ('R2_20', 0, '00:14:53.9'),
      ('R2_20', 1, '00:15:05.9'),
      ('R2_20', 0, '00:15:07.9'),
      ('R2_20', 1, '00:15:15.9'),
      ('R2_20', 1, '00:15:16.9'),
      ('R2_20', 0, '00:15:17.5'),
      ('R2_20', 0, '00:15:17.9'),
      ('R2_20', 1, '00:15:26.0'),
      ('R2_20', 0, '00:15:28.0'),
      ('R2_20', 1, '00:15:36.0'),
      ('R2_20', 0, '00:15:37.0'),
      ('R2_20', 0, '00:15:38.0')
    ) t(sn, a, ts)
  ),
  a AS (
    SELECT
      *,
      ROW_NUMBER() OVER (PARTITION BY SourceName ORDER BY EventTimeStamp) -
        ROW_NUMBER() OVER (PARTITION BY SourceName, Active ORDER BY EventTimeStamp) g
    FROM AllEvents
  ),
  b AS (
    SELECT
      SourceName,
      Active,
      IIF(Active = 0, MAX(EventTimeStamp), MIN(EventTimeStamp)) start
    FROM a
    GROUP BY SourceName, Active, g
  ),
  c AS (
    SELECT
      *,
      LEAD(start) OVER (PARTITION BY SourceName ORDER BY start, Active DESC) [end],
      DATEDIFF(millisecond,
               start,
               LEAD(start) OVER (PARTITION BY SourceName
                                 ORDER BY start, Active DESC)) difference
    FROM b
  )
SELECT * FROM c WHERE Active = 1 ORDER BY start;

我在“开始”和“结束”列中存储的时间,现在我需要找到这两列之间的差异,您的预期输出要求您包括什么并解释逻辑?sname active event timestamp active Inavtive R2_20 1 14:51.9 14:51.9 NULL R2_20 0 14:53.9 NULL 14:53.9 R2_20 1 15:05.9 15:05.9 NULL R2_20 15:07.9 NULL 15:07.9请参见第1行,14:51.9(active=1)应该从14:53.9(inactive=0)中减去,并存储在Difference列中感谢您的快速响应,请参阅Eventtimestamp是存储同一列的时间,基于active和inactive,我必须将其分为两列,这是我使用发布的代码所做的,现在使用这些active和inactive列,我必须找到差异,在这种情况下,发生的是,活动(1)存储一些时间,在非活动列中存储null,活动列中的下一行存储null,非活动(0)列存储时间,所以我无法找到活动和非活动之间的差异