计算数据集的持续时间
Calculate duration of sets of data
我在 SQL 中有一组数据,如下所示:
╔═══════════╦═══════╗
║ TimeStamp ║ State ║
╠═══════════╬═══════╣
║ 7:10 AM ║ A ║
║ 7:11 AM ║ A ║
║ 7:12 AM ║ A ║
║ 7:13 AM ║ B ║
║ 7:14 AM ║ B ║
║ 7:15 AM ║ A ║
║ 7:16 AM ║ A ║
║ 7:17 AM ║ C ║
║ 7:18 AM ║ C ║
╚═══════════╩═══════╝
我正在尝试计算每个状态的持续时间。但是,我想分离每个状态序列并分别计算它们的差异,同时分离重复的状态。所以我希望上面的数据 return 如下所示:
╔═══════╦════════════════════╗
║ State ║ Duration (minutes) ║
╠═══════╬════════════════════╣
║ A ║ 2 ║
║ B ║ 1 ║
║ A ║ 1 ║
║ C ║ 1 ║
╚═══════╩════════════════════╝
有人可以帮忙吗?我如何编写一个 SQL 查询 return 给我这个数据?
谢谢!
好吧,我假设需要的是 MS SQL 服务器。
为了达到预期的结果(其中 C 的持续时间为 1):
select
state, MIN(TimeStamp) StartsAt, EndsAt, datediff(minute,MIN(TimeStamp),EndsAt) DurationMinutes
from (
select
t1.state, t1.TimeStamp
, ISNULL(ca.EndsAt, (select max(timestamp) from table1) ) EndsAt
from table1 t1
outer apply (
select top (1) t2.timestamp as EndsAt
from table1 t2
where t1.state <> t2.state and t1.TimeStamp < t2.TimeStamp
order by t2.TimeStamp
) ca
) as derived
group by
state, EndsAt
对于数据样本,有人可能会争辩说 C 的持续时间是未知的,因为状态尚未改变。在那种情况下它有点简单:
select
state, MIN(TimeStamp) StartsAt, EndsAt, datediff(minute,MIN(TimeStamp),EndsAt) DurationMinutes
from (
select
t1.state, t1.TimeStamp ,ca.EndsAt
from table1 t1
outer apply (
select top (1) t2.timestamp as EndsAt
from table1 t2
where t1.state <> t2.state and t1.TimeStamp < t2.TimeStamp
order by t2.TimeStamp
) ca
) as derived
group by
state, EndsAt
您没有提到 RDBMS,所以这里是适用于任何数据库的答案。如果您需要快速解决方案,请提及您使用的 SQL 基数,以便您能够使用此类查询所需的某些特定 functions/commands(访问上一条、下一条记录...)。
SELECT MIN(timeStamp),MAX(timeStamp),State
FROM(
SELECT TimeStamp,State,(SELECT count(*) FROM t
where state<>t1.state
and TimeStamp<t1.TimeStamp) as Grp
from t as t1
) as t2
GROUP BY State,Grp
我在 SQL 中有一组数据,如下所示:
╔═══════════╦═══════╗
║ TimeStamp ║ State ║
╠═══════════╬═══════╣
║ 7:10 AM ║ A ║
║ 7:11 AM ║ A ║
║ 7:12 AM ║ A ║
║ 7:13 AM ║ B ║
║ 7:14 AM ║ B ║
║ 7:15 AM ║ A ║
║ 7:16 AM ║ A ║
║ 7:17 AM ║ C ║
║ 7:18 AM ║ C ║
╚═══════════╩═══════╝
我正在尝试计算每个状态的持续时间。但是,我想分离每个状态序列并分别计算它们的差异,同时分离重复的状态。所以我希望上面的数据 return 如下所示:
╔═══════╦════════════════════╗
║ State ║ Duration (minutes) ║
╠═══════╬════════════════════╣
║ A ║ 2 ║
║ B ║ 1 ║
║ A ║ 1 ║
║ C ║ 1 ║
╚═══════╩════════════════════╝
有人可以帮忙吗?我如何编写一个 SQL 查询 return 给我这个数据?
谢谢!
好吧,我假设需要的是 MS SQL 服务器。
为了达到预期的结果(其中 C 的持续时间为 1):
select
state, MIN(TimeStamp) StartsAt, EndsAt, datediff(minute,MIN(TimeStamp),EndsAt) DurationMinutes
from (
select
t1.state, t1.TimeStamp
, ISNULL(ca.EndsAt, (select max(timestamp) from table1) ) EndsAt
from table1 t1
outer apply (
select top (1) t2.timestamp as EndsAt
from table1 t2
where t1.state <> t2.state and t1.TimeStamp < t2.TimeStamp
order by t2.TimeStamp
) ca
) as derived
group by
state, EndsAt
对于数据样本,有人可能会争辩说 C 的持续时间是未知的,因为状态尚未改变。在那种情况下它有点简单:
select
state, MIN(TimeStamp) StartsAt, EndsAt, datediff(minute,MIN(TimeStamp),EndsAt) DurationMinutes
from (
select
t1.state, t1.TimeStamp ,ca.EndsAt
from table1 t1
outer apply (
select top (1) t2.timestamp as EndsAt
from table1 t2
where t1.state <> t2.state and t1.TimeStamp < t2.TimeStamp
order by t2.TimeStamp
) ca
) as derived
group by
state, EndsAt
您没有提到 RDBMS,所以这里是适用于任何数据库的答案。如果您需要快速解决方案,请提及您使用的 SQL 基数,以便您能够使用此类查询所需的某些特定 functions/commands(访问上一条、下一条记录...)。
SELECT MIN(timeStamp),MAX(timeStamp),State
FROM(
SELECT TimeStamp,State,(SELECT count(*) FROM t
where state<>t1.state
and TimeStamp<t1.TimeStamp) as Grp
from t as t1
) as t2
GROUP BY State,Grp