2015-04-22 173 views
1

我很努力想出一種方法來解決這個問題。我想從一個特定的價值開始,每增加一個新的線就不斷增加1。SQL循環增加數字

例如,如果我有這樣的表。

90  
93  
110 
87  
130 
Etc.. 

我要選擇的號碼87,然後繼續從那裏增加了,但也看到如果增加的數量是存在的,跳過它。

我只是努力將正確的邏輯放在我的腦海。我知道我需要一段時間的循環來繼續閱讀桌面,但我想不出正確的方式去做。只是尋求一些建議來推動我朝着正確的方向發展。

編輯:我使用T-SQL的MSFT SQL Server 2012的

這裏的輸出應該是什麼樣子

90  
93  
110 
87  
130 
88  
89  
91  
92  
94 

這將跳過增加90和93的例子,因爲他們已經存在於表格中。

我希望這對你們有意義。

+1

請編輯您的問題,並顯示你正在試圖獲得滿意的結果。還要用您實際使用的數據庫標記問題。 –

+1

作爲一般的SQL觀察,您不應該在程序上考慮解決方案。雖然許多方言支持迭代,但在大多數情況下,一套(或可能是序列)導向的方法將更加穩健地爲您提供正確的結果。爲了更好地回答您的問題,請提供輸入和輸出表的具體示例。 – Pekka

+0

所以,重點是讓所有的數字在一個範圍內失蹤? – UnhandledExcepSean

回答

0

我做的這一切在一個遞歸CTE和我做,所以你可以通過使用秩序,保障您的結果以正確的順序返回。

對於遞歸,您可以選擇並開始和結束數字或@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 
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 
0

有可以使用名爲master..spt_values數字的系統表。

DECLARE樣品臺

DECLARE @tbl TABLE(Id INT) 

INSERT語句

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

您可以輕鬆地做出UNION去除內CTE

重複珍惜你在你的桌子和 ORDER
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

+0

除非你的聯盟不工作,因爲你的row_id不同,所以你需要重複OP和OP所不需要的90和93。 – Stephan

+0

感謝您指出。修復了這個問題。 – sqluser