gpt4 book ai didi

sql - 选择范围内的最小数字

转载 作者:行者123 更新时间:2023-12-03 03:21:15 26 4
gpt4 key购买 nike

我有一个包含类似数据的表格。

ItemCode
1000
1002
1003
1020
1060

我正在尝试编写一条 SQL 语句来获取不在该表中的最小编号 (ItemCode),并且一旦将前一个最小订单 ID 插入表中,它应该能够获取下一个最小编号,但是还跳过数据库中已有的数字。我只想在每次运行查询时获得 1 个结果。

因此,根据上表,它应该得到 1001 作为第一个结果。将 ItemCode = 1001 插入到表中后,它应该得到的下一个结果应该是 1004,因为 10001003 表中已存在。

根据我在网上看到的所有内容,我认为我必须使用 While 循环来执行此操作。这是我仍在研究的代码。

DECLARE @Count int
SET @Count= 0
WHILE Exists (Select ItemCode
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060')
Begin
SET @COUNT = @COUNT + 1

select MIN(ItemCode) + @Count
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060'
END

我觉得必须有一种更简单的方法来实现这一目标。有什么办法让我说...

选择表 X 中不存在的 1000 到 1060 之间的最小数字

编辑:在我的情况下创建新表不是一个选项

最终编辑:谢谢大家!我得到了它。这是我的最终查询,它返回了我想要的结果。我知道我无缘无故地把事情搞得太复杂了!

With T0 as ( select convert(int,ItemCode) + row_number() over (order by convert(int,ItemCode)) as ItemCode
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
And convert(int,ItemCode) <= '1060')
Select MIN(convert(varchar,ItemCode)) as ItemCode
from T0
where convert(int,ItemCode) Not in (Select convert(int,ItemCode)
from OITM
where itemCode like '10%'
AND convert(int,ItemCode) >= '1000'
and convert(int,ItemCode) <= '1060');

最佳答案

这应该可以解决问题。在这里,您为行生成序号,然后将每一行与下一行进行比较(通过连接条件完成),并仅过滤差值不为 1 的行,按顺序排序,最后选择最上面的行。

;with c as(select id, row_number() over(order by id) rn)
select top 1 c1.id + 1 as NewID
from c as c1
join c as c2 on c1.rn + 1 = c2.rn
where c2.id - c1.id <> 1
order by c1.rn

关于sql - 选择范围内的最小数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com