想象一下1000条记录。 3列。记录编号,颜色,2ndNumber。记录号和颜色已放入数据库中,但2ndnumber为空。我想运行一个SQL更新语句,将第1个数字放在第2个记录中。这个数字最多为40,因此记录数40将是第2个数字。然后,记录数41将重新开始并在第2个数字中放置1。我希望代码一遍又一遍地计数1-40,将值放入第二个数字,直到所有记录都更新为止。
我有一张1000个记录的表格
record_number color second_number
1 blue null
2 green null
3 yellow null
4 red null
. . .
. . .
. . .
1000 white null
下面给出了所需的结果: -
record_number color second_number
1 blue 1
2 green 2
3 yellow 3
4 red 4
. . .
. . .
. . .
39 yellow 39
40 red 40
41 yellow 1
42 red 2
43 blue 3
44 green 4
. . .
. . .
. . .
79 yellow 39
80 red 40
81 green 1
82 blue 2
83 red 3
84 yellow 4
. . .
. . .
. . .
and so on
在每40条记录之后,second_number列必须从1开始再到下一个40,如所需输出所示
答案 0 :(得分:1)
假设您的记录编号(第一列)是一个线性系列,您可以利用它来利用MOD函数填充您的第三个字段
update table set 3rdColumn=MOD(first_column, 40)
如果您的first_column从1或41或同样开始,这将有效。
希望它有所帮助! .. :))
答案 1 :(得分:0)
我喜欢@TarunGaba提供的简单方法。这是我稍稍复杂的方法......
;with cte as (
select * from tbl
), with_grp_number as (
select *, (case when record_number = 1 then 1 else record_number - 1 end) / 40 as grp_number
from cte
), with_update_column as (
select *, row_number() over (partition by grp_number order by record_number) as update_column
from with_grp_number
)
update t
set second_number = t1.update_column
from tbl t
join with_update_column t1
on t.record_number = t1.record_number
select * from tbl
关于record_number是顺序的非常好的假设...但是,使用这种特殊方法,如果记录号不是连续的,你可以在第一个CTE中使用row_number()函数来生成顺序值。
希望这会有所帮助...我希望重新调整我喜欢@ TarunGaba的解决方案......我不是想偷你的雷声......但是认为这个解决方案可能会有所帮助。
答案 2 :(得分:-1)
我有一个想法,但是对于小记录的记录我知道它会花费时间但是它会让你输出你想要的东西..
DECLARE @I INT=1
DECLARE @J INT
DECLARE @K INT
WHILE(@I<=1000)
BEGIN
SELECT @J=ID FROM TABLE WHERE ID=@I
IF(@J%40=0)
BEGIN
SET @K=1
END
ELSE
BEGIN
UPDATE SET SECONDNUMBER=@K WHERE ID=@I
SET @K=@K+1
END
SET @I=@I+1
END