首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迂回的twist问题

迂回的twist问题
EN

Database Administration用户
提问于 2015-08-14 23:57:49
回答 1查看 1.7K关注 0票数 6

我有一个表,需要填充值,这些值使用给定的步骤大小递增。此外,我也有一个范围的概念,以便一定数量的步骤将适合范围内(不一定是均匀的)。一旦射程结束,循环过程就需要发生.扭转的是,我还需要数一数我做了多少次循环,一旦达到给定的最大的循环,我需要重新设置我的循环的计数。由于这是令人困惑的,下面是一个例子。

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

以下是结果输出:

代码语言:javascript
复制
    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

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

代码语言:javascript
复制
    id          iteration   step
    ----------- ----------- -----------
    18          0           6
    19          0           13
    20          0           20

对于如何做到这一点,我非常感激。

谢谢!

P.S.这个问题源于需要生成SQL Agent作业计划,这些计划的间隔是均匀的,但运行频率必须不少于每小时一次,等等。因此,我不能继续增加开始时间。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-08-16 16:23:22

再次感谢弗拉基米尔提供公式!完成我需要的事情的正确方法是:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/111117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档