简而言之: 我需要按照我需要的数据来按摩数据。
我希望能够使用X行数更新tableA中的列。到达X后,我想要增加值,然后再次更新X行数。这应该是非常基本的。我的内容如下。
DECLARE @New_TripKey INT = 379; --where tripkey = the value to start at
IF @@ROWCOUNT < 24 --update for 24 rows
BEGIN
UPDATE [GoogleTransit].[dbo].[Stop_Times_TEst] --update table
--sets tripkey value = 379 and increments 379 by 1
SET @New_TripKey = tripkey = @new_tripkey + 1
WHERE TripKey = 3 --this finds all current value = 3 in Stop_Times_Test
PRINT 'Updated Rows';
END
我正在寻找有关如何推进此问题的建议,我已经考虑了多种选择。比如Merging,Cursors等。我觉得它应该比这更基本。
〜感谢
编辑:
USE GoogleTransit
GO
BEGIN --24 rows updated
DECLARE @New_TripKey INT = 379;
DECLARE @COUNTERINT INT
SET @COUNTERINT = 1
WHILE (@COUNTERINT < 22)
BEGIN --while
WITH cte AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY TripKey ORDER BY TripKey) AS RN
FROM Stop_Times_Loop
WHERE TripKey = 3
)
UPDATE cte
SET tripkey = @New_TripKey --(RN-(RN-1)%24)/24 + @New_TripKey
WHERE RN <= 24
END --while
SET @COUNTERINT = @COUNTERINT+1;
SET @New_TripKey = @New_TripKey +1;
END --24 rows updated
注意:上面的代码一次更新24行,但不满足WHILE条件,这意味着即使所有TripKey = 3都已更新,循环仍会继续尝试和处理。此外,上面的代码不会增加TRIP KEY编号,因此即使它一次更新24行,值也不会改变。 - 我的问题是在每次更新24行之后无法确定在何处或如何增加tripkey值。
如果我需要清除任何内容,请告诉我。
答案 0 :(得分:1)
您可以更新CTE,并结合ROW_NUMBER()
功能,我认为您可以轻松获得所需内容:
;WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN
FROM TableName
WHERE TripKey = 3
)
UPDATE cte
SET tripkey = tripkey + RN + 378
WHERE RN <= 24
请注意,由于ORDER BY (SELECT 1)
,它正在更新任意24行,如果要更新特定行,请更改ORDER BY
子句。如果您尝试更新多个集,则可以向PARTITION BY
函数添加ROW_NUMBER()
子句。
更新:根据评论,您还需要将模数除法添加到组合中:
;WITH cte AS (SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN
FROM TableName
WHERE TripKey = 3
)
UPDATE cte
SET tripkey = (RN-(RN-1)%24)/24 + 379