循环 T-SQL 问题

SQL*_*Guy 6 t-sql

我有一个表,我需要在其中填充值,这些值使用给定的长递增。此外,我还有一个range的概念,因此一定数量的步长将适合范围内(不一定均匀)。一旦到达范围的末端,就需要进行循环过程。扭曲的是,我还需要计算我执行循环的次数,一旦达到给定的最大循环,我需要重置循环的计数。由于这令人困惑,这里有一个插图。

让我们创建并填充一个简单的表:

IF OBJECT_ID('tempdb..#mytable') IS NOT NULL DROP TABLE   
tempdb.dbo.#mytable

CREATE TABLE #mytable (
id INT IDENTITY(1,1),
iteration INT,
step INT
)

INSERT #mytable
DEFAULT VALUES
GO 20
Run Code Online (Sandbox Code Playgroud)

现在让我们声明一些变量并使用它们来更新表中的数据(请注意,未使用 @max_iterations 变量,因为我不知道如何利用它以及为什么要问我的问题):

DECLARE @step_size              INT = 7,
        @max_iteration_range    INT = 40,
        @max_iterations         INT = 2

UPDATE  #mytable
SET     iteration = (id*@step_size)/@max_iteration_range, 
        step = (id*@step_size)%@max_iteration_range

SELECT * FROM #mytable
Run Code Online (Sandbox Code Playgroud)

这是结果输出:

    id          iteration   step
    ----------- ----------- -----------
    1           0           7
    2           0           14
    3           0           21
    4           0           28
    5           0           35
    6           1           2
    7           1           9
    8           1           16
    9           1           23
    10          1           30
    11          1           37
    12          2           4
    13          2           11
    14          2           18
    15          2           25
    16          2           32
    17          2           39
    18          3           6
    19          3           13
    20          3           20
Run Code Online (Sandbox Code Playgroud)

我试图解决的问题反映在最后三行中。由于我的@max_iterations 变量设置为 2,一旦我在“迭代”列中超过这个值,我想回到 0 并重新开始。最后三行应该是:

    id          iteration   step
    ----------- ----------- -----------
    18          0           6
    19          0           13
    20          0           20
Run Code Online (Sandbox Code Playgroud)

我很感激有关如何实现这一目标的任何建议。

谢谢!

PS 这个问题源于需要生成均匀间隔的 SQL 代理作业计划,但必须以不少于每 X 小时/分钟等的频率运行。所以我不能继续增加开始时间。

SQL*_*Guy 3

再次感谢 Vladimir 提供公式!完成我需要的正确方法是这样的:

DECLARE @step_size              INT = 7,
        @max_iteration_range    INT = 40,
        @max_iterations         INT = 2

UPDATE  #mytable
SET     
        iteration = ((id*@step_size)/@max_iteration_range) % (@max_iterations+1),
        step =       (id*@step_size)%@max_iteration_range

SELECT * FROM #mytable
Run Code Online (Sandbox Code Playgroud)