SQL循环增加数字

时间:2015-04-22 01:29:11

标签: sql sql-server tsql sql-server-2012

我正在努力想出一个解决这个问题的方法。我想从一个特定的值开始,每次换一行时都要增加1。

例如,如果我有一个这样的表。

90    
93    
110   
87    
130  
Etc..

我想选择数字87,然后继续从那里递增,但也读取增加的数字是否存在并跳过它。

我正在努力将正确的逻辑放在我的脑海里。我知道我需要一个while循环来继续读表,但我无法想出正确的方法。只是寻找一些建议让我朝着正确的方向前进。

编辑:我正在使用T-SQL进行MSFT SQL Server 2012。

以下是输出应该是什么样子的示例

90    
93    
110   
87    
130  
88    
89    
91    
92    
94

它会跳过添加90和93,因为它们已经存在于表中。

我希望这对你们有意义。

4 个答案:

答案 0 :(得分:1)

我在一个递归CTE中完成所有这些操作,因此您可以使用order by并保证您的结果以正确的顺序返回。

对于递归,您可以选择和开始和结束数字或@desiredNumberOfNewValues(请记住,它不考虑重复)。如果您有任何疑问或需要其他任何问题,请与我们联系。

DECLARE @yourTable TABLE (nums INT);
INSERT INTO @yourTable
    VALUES (90),(93),(110),(87),(130);


DECLARE @Specific_Number INT = 87;
DECLARE @Last_Number INT = 94;
DECLARE @DesiredNumberOfNewValues INT = 7;

WITH CTE_Numbers
AS
(
    SELECT 1 AS order_id,nums, 1 AS cnt
    FROM @yourTable

    UNION ALL

    SELECT  2, 
            CASE
                WHEN @Specific_Number + cnt NOT IN (SELECT * FROM @yourTable) --if it's not already in the table, return it
                    THEN @Specific_Number + cnt
                ELSE NULL -- if it is in the table, return NULL
            END,
            cnt + 1
    FROM CTE_Numbers
    WHERE   nums = @Specific_Number
            --OR (cnt > 1 AND @Specific_Number + cnt < @Last_Number) --beginning and end(option 1)
            OR (cnt > 1 AND cnt <= @DesiredNumberOfNewValues) --number of new values(option 2)
)

SELECT order_id,nums
FROM CTE_Numbers
WHERE nums IS NOT NULL
ORDER BY order_id,nums

结果:

order_id    nums
----------- -----------
1           87
1           90
1           93
1           110
1           130
2           88
2           89
2           91
2           92
2           94

答案 1 :(得分:0)

您可以通过使用Numbers表进行一些修改来完成此操作。在SQL Server中,您可以执行以下操作。假设测试有数据。要创建Numbers表,请参阅以下链接。

http://dataeducation.com/you-require-a-numbers-table/

SELECT n.Number,t.ColB
FROM Numbers n 
LEFT JOIN Test t
    ON n.Number = t.ColA
Where n.Number < (SELECT MAX(COLA) FROM Test t)

答案 2 :(得分:0)

WITH Numbers_CTE (Number)
AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1 FROM Numbers_CTE
)
SELECT top 10 *
FROM Numbers_CTE n
LEFT JOIN <TABLE> t ON t.ID=n.Number
WHERE t.ID IS NULL
AND n.Number BETWEEN 5 AND 100

答案 3 :(得分:0)

有一个系统表可用于名为master..spt_values的数字。

DECLARE示例表

DECLARE @tbl TABLE(Id INT)

INSERT语句

INSERT INTO @tbl VALUES (90)   
                        ,(93)    
                        ,(110)   
                        ,(87)    
                        ,(130)

您可以轻松地UNION删除表格中的重复值,并ORDER

中的CTE
DECLARE @number INT = 87

;WITH C AS(
    SELECT Id, Row_Id, ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Id) AS Rn FROM (
        SELECT 1 AS Row_Id, Id FROM @tbl
        UNION
        SELECT 2 AS Row_Id, number
        FROM master..spt_values
        WHERE [type] = 'P'
        AND number >= @number
    ) t
)
SELECT Id FROM C
WHERE Rn = 1
ORDER BY Row_Id, Id

<强>输出

Id
----
87
90
93
110
130
88
89
91
92
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
111
112
113
114
.
.
.

SQLFiddle