我有一个表,我将在MSSQL中没有光标循环。
Unit Speed C Count x y
A | 200 | 200 | 3 | 3 | 0
A | 230 | 230 | 4 | 7 | 0
A | 240 | 240 | 3 | 10 | 0
A | 250 | 255 | 2 | >=12 | 5
A | 260 | 255 | 2 | 2 | 0
A | 270 | 255 | 2 | 4 | 0
A | 280 | 255 | 3 | 7 | 0
A | 290 | 255 | 4 | 11 | 0
A | 300 | 260 | 2 | >=12 | 5
A | 310 | 260 | 2 | 2 | 0
A | 320 | 260 | 2 | 4 | 0
A | 340 | 260 | 2 | 6 | 0
在 X 值的摘要与 12相等或相同之后,如何使 C 值保持不变(第一个记录的速度+ 5和下一个值的C + 5)
我想在没有游标的情况下循环记录(因为如果我使用游标,数据库将会死锁)。
答案 0 :(得分:0)
在常见的表表达式和一些窗口函数的帮助下,我提出了以下解决方案。请注意,您需要一些列来对表进行排序。
With cte AS
(
SELECT RowOrder
,cCount
,SUM(cCount) OVER(order by RowOrder) As SumcCount
FROM Tbl
)
SELECT RowOrder
,cCount
,SumcCount % 12 as x
,CASE WHEN SumcCount >= 12
AND RANK() OVER (Partition by SumcCount / 12 ORDER BY RowOrder) = 1 THEN
5
ELSE
0
END As y
FROM CTE
ORDER BY RowOrder
说明:
OVER
子句的SUM
函数允许cCount的累积总和(我不想使用计数,因为它是一个保留字)。 RANK
函数给了我一个简单的方法来确定cCount的累积和是否等于12或更多的任何乘法。请注意,如果还存在cCount的累计总和为12或更多的情况。