从同一列中拆分时间并存储到两列中,然后在sql中查找这两列之间的差异
从同一列中拆分时间并存储到两列中,然后在sql server中查找这两列之间的差异从同一列中拆分时间并存储到两列中,然后在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
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)列存储时间,所以我无法找到活动和非活动之间的差异