我正在努力想出一个解决这个问题的方法。我想从一个特定的值开始,每次换一行时都要增加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,因为它们已经存在于表中。
我希望这对你们有意义。
答案 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
.
.
.