如何在没有游标的情况下在 SQL 中创建常量值

how to make constant value in MSSQL without cursor

我有一个 table,我将在 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


如何使 C 值在汇总 X 值后保持不变(第一个记录的速度 + 5,下一个值的 C + 5)等于或与 12?

相同

我想在没有游标的情况下循环记录(因为如果我使用游标,数据库会死锁)。

在常见 table 表达式和一些 window 函数的帮助下,我想出了以下解决方案。请注意,您需要一些列来对 table.

进行排序
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

解释:

  • Common table expressions 是一种创建临时结果集的方法。
  • 使用带有 OVER 子句的 SUM 函数允许对 cCount 进行累加和计算(我不想使用 count,因为它是一个保留字)。
  • 使用 RANK 函数为我提供了一种简单的方法来确定 cCount 的累加和是否等于 12 或更多的任何乘法。注意case中还有cCount的累计和为12以上的条件