Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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_Gaps And Islands - Fatal编程技术网

Sql 计算数据集的持续时间

Sql 计算数据集的持续时间,sql,gaps-and-islands,Sql,Gaps And Islands,我在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

我在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   ║
╚═══════════╩═══════╝
╔═══════╦════════════════════╗
║ State ║ Duration (minutes) ║
╠═══════╬════════════════════╣
║   A   ║         2          ║
║   B   ║         1          ║
║   A   ║         1          ║
║   C   ║         1          ║
╚═══════╩════════════════════╝
我试图计算每个状态的持续时间。但是,我想分离每个状态序列,分别计算它们的差异,分离重复的状态。因此,我希望上述数据返回如下内容:

╔═══════════╦═══════╗
║ 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   ║
╚═══════════╩═══════╝
╔═══════╦════════════════════╗
║ State ║ Duration (minutes) ║
╠═══════╬════════════════════╣
║   A   ║         2          ║
║   B   ║         1          ║
║   A   ║         1          ║
║   C   ║         1          ║
╚═══════╩════════════════════╝
有人能帮忙吗?如何编写返回此数据的SQL查询


谢谢大家!

我假设需要MS SQL Server

为达到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库,以便能够使用某些特定的函数/命令访问上一条记录、下一条记录,。。。需要这样一个查询

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?e、 甲骨文?MSsql?它还可以对解决方案选项产生很大的影响:是否有日期列?除了状态列之外是否还有顺序?正如您所看到的,使用简单的GROUPBY在这里不起作用,因为您实际上需要State列的子组,因此我的问题是。