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'
;