Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 计数记录超出“N”个连续值_Sql Server - Fatal编程技术网

Sql server 计数记录超出“N”个连续值

Sql server 计数记录超出“N”个连续值,sql-server,Sql Server,我有一张表,上面有一辆车每秒的速度记录。如果车辆停止,速度列的值为0。我需要计算车辆移动的时间 条件: 如果车辆停止3秒或更长时间,这将被视为停止时间 如果车辆停止时间少于3秒,这将被视为移动时间 我已经有一个计算这个值的游标,但是我想删除游标的使用并优化查询 样本数据: create table Vehicle(Timer datetime,Speed int) insert into Vehicle values ('1-Jan-2015 00:00:01',10) insert into

我有一张表,上面有一辆车每秒的速度记录。如果车辆停止,速度列的值为0。我需要计算车辆移动的时间

条件:

如果车辆停止3秒或更长时间,这将被视为停止时间 如果车辆停止时间少于3秒,这将被视为移动时间 我已经有一个计算这个值的游标,但是我想删除游标的使用并优化查询

样本数据:

create table Vehicle(Timer datetime,Speed int)
insert into Vehicle values ('1-Jan-2015 00:00:01',10)
insert into Vehicle values ('1-Jan-2015 00:00:02',14)
insert into Vehicle values ('1-Jan-2015 00:00:03',15)
insert into Vehicle values ('1-Jan-2015 00:00:04',14)
insert into Vehicle values ('1-Jan-2015 00:00:05',16)
insert into Vehicle values ('1-Jan-2015 00:00:06',0) -- do not count (3 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:07',0) -- do not count (3 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:08',0) -- do not count (3 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:09',4)
insert into Vehicle values ('1-Jan-2015 00:00:10',5)
insert into Vehicle values ('1-Jan-2015 00:00:11',5)
insert into Vehicle values ('1-Jan-2015 00:00:12',0)
insert into Vehicle values ('1-Jan-2015 00:00:13',0)
insert into Vehicle values ('1-Jan-2015 00:00:14',14)
insert into Vehicle values ('1-Jan-2015 00:00:15',15)
insert into Vehicle values ('1-Jan-2015 00:00:16',0)-- do not count (4 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:17',0)-- do not count (4 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:18',0)-- do not count (4 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:19',0)-- do not count (4 consecutive)
insert into Vehicle values ('1-Jan-2015 00:00:20',10)
insert into Vehicle values ('1-Jan-2015 00:00:21',12)

-- select * from Vehicle
结果

使用行号:

MOVEMENTTIME (in Seconds)
--------------------
14
;WITH Cte AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(ORDER BY Timer) -
             ROW_NUMBER() OVER(
                PARTITION BY CASE WHEN Speed > 0 THEN 1 ELSE 0 END
                ORDER BY Timer
            )
    FROM Vehicle
),
CteCnt AS(
    SELECT RN,Speed, cnt = COUNT(*)
    FROM Cte
    GROUP BY RN, Speed
)
SELECT SUM(cnt)
FROM CteCnt
WHERE
    Speed > 0
    OR (Speed = 0 AND cnt < 3)