Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
TSQL游标可用于加快查询速度_Tsql_Sql Server 2008 R2 - Fatal编程技术网

TSQL游标可用于加快查询速度

TSQL游标可用于加快查询速度,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,[Time]列保存POSIX时间 我希望能够计算给定[Status]在给定时间段内处于活动状态的秒数,而无需使用光标。如果这是唯一的,那就好了,因为我已经这么做了 使用上述示例数据提取,我如何计算“Status1”已激活多长时间 也就是说,从Row4.[Time]减去Row1.[Time],从Row9.[Time]减去Row13.[Time]从Row15.[Time]减去 提前谢谢假设每一行表示特定的状态在指定的时间到下一行都处于活动状态,则必须以某种方式计算第N行和第N+1行之间的差异。一种方

[Time]
列保存POSIX时间

我希望能够计算给定
[Status]
在给定时间段内处于活动状态的秒数,而无需使用光标。如果这是唯一的,那就好了,因为我已经这么做了

使用上述示例数据提取,我如何计算“Status1”已激活多长时间

也就是说,从
Row4.[Time]
减去
Row1.[Time]
,从
Row9.[Time]
减去
Row13.[Time]
Row15.[Time]
减去


提前谢谢

假设每一行表示特定的
状态
在指定的
时间
到下一行都处于活动状态,则必须以某种方式计算第N行和第N+1行之间的差异。一种方法是使用嵌套查询(请在此处尝试:)

如果
值没有间隙,则将工作。如果它们确实存在间隙,您可以尝试以下方法:

对于与指定状态匹配的每一行,CROSS APPLY子句中的相关子查询将根据
的升序获取下一个
时间
值。然后从下一行的时间中减去当前行的时间,并使用
SUM()
将所有差异相加


请注意,在这两种解决方案中,都暗示
值的顺序遵循
时间
值的顺序。换句话说,
orderbyrow
被假定为等同于
orderbytime
,或者,如果
Time
可以有重复项,那么就
orderbytime,Row

您能告诉我们这组15行的期望结果是什么吗?您实际上可以避免使用子选择<代码>从…中选择总和(s.Time-f.Time)
就可以了。谢谢Andrey M,“行”值中有空白,所以您的工作效果更好
 Row Status  Time
 1   Status1 1383264075
 2   Status1 1383264195
 3   Status1 1383264315
 4   Status2 1383264435
 5   Status2 1383264555
 6   Status2 1383264675
 7   Status2 1383264795
 8   Status1 1383264915
 9   Status3 1383265035
 10  Status3 1383265155
 11  Status2 1383265275
 12  Status3 1383265395
 13  Status1 1383265515
 14  Status1 1383265535
 15  Status2 1383265615
SELECT SUM(Duration) as Duration
FROM (
  SELECT f.Status, s.Time-f.Time as Duration
  FROM Table1 f
  JOIN Table1 s on s.Row = f.Row+1
  WHERE f.Status = 'Status1') a
SELECT
  TotalDuration = SUM(next.Time - curr.Time)
FROM
  dbo.atable AS curr
CROSS APPLY
  (
    SELECT TOP (1) Time
    FROM dbo.atable
    WHERE Row > curr.Row
    ORDER BY Row ASC
  ) AS next
WHERE
  curr.Status = 'Status1'
;