能够使用1值更新x行数,然后递增该值

时间:2013-12-17 18:30:31

标签: sql tsql

简而言之: 我需要按照我需要的数据来按摩数据。

我希望能够使用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值。

如果我需要清除任何内容,请告诉我。

1 个答案:

答案 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