sql - 从同一列拆分时间并存储到 2 列并在 sql 中查找这 2 列之间的差异

标签 sql sql-server

从同一列拆分时间并存储到 2 列,并在 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 版本支持 LEAD功能,使用它。但这只是我根据您提供的数据做出的猜测。

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;

关于sql - 从同一列拆分时间并存储到 2 列并在 sql 中查找这 2 列之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53880204/

相关文章:

sql - 帮助删除数据库中的 HTML 特殊字符

python - 使用核心 SQLAlchemy 插入和更新

sql-server - 是否有允许探索数据库和运行 SQL 的轻量级 SQL gui?

sql-server - 链接服务器和 Entity Framework 代码优先的日期时间参数问题

sql - UNIQUE - 在表中有唯一行的方法?

mysql - 数据库设计: Best Way to store heterogeneous subtypes of a parent class?

sql - 如何将 accdb 转换为 postgres 数据库

mysql - 如何获得 SUM 以通过连接正确计算?

c# - 如何在 Xamarin Forms 中将 Entity Framework Core 与 SQL Server 结合使用?

sql - 根据计算转换 SQL Server 表