Foxtable(狐表)用户栏目专家坐堂 → 求救如何用sql找出一段连续的流水号之间缺失的号码


  共有2082人关注过本帖树形打印复制链接

主题:求救如何用sql找出一段连续的流水号之间缺失的号码

帅哥哟,离线,有人找我吗?
chen37280600
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1265 积分:7838 威望:0 精华:4 注册:2017/12/31 14:53:00
求救如何用sql找出一段连续的流水号之间缺失的号码  发帖心情 Post By:2019/8/27 15:37:00 [只看该作者]

一段连续的流水号,比如1~10,查询中间缺失的号码,比如,4、7、8、9。
或者更复杂一点,查询每个ID下的缺失流水号,比如ID为1,从1~10中间缺失的流水号,ID为2,从5~13的流水号。


此主题相关图片如下:1.png
按此在新窗口浏览图片


百度只找到Oracle的解决方法,我是mssql,不知道怎么解决,求版主搭救,给一段sql代码
[此贴子已经被作者于2019/8/27 15:37:39编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106132 积分:539771 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/27 17:33:00 [只看该作者]

只能处理2048以内的流水号

with cte as
(
    select ID,流水号
    from 表A
),
CTE1 AS 
(
select distinct number,a.id from master..spt_values as m cross join cte as a
where type='p' and number<(select MAX(b.流水号) from cte as b where b.id = a.id) 
and number>=(select MIN(k.流水号) from cte as k where k.id = a.id)
)

SELECT c.id,number+1 AS 流水号  FROM CTE1 as c LEFT JOIN CTE as d
ON c.number=d.流水号-1 and c.id=d.id
WHERE d.流水号 IS NULL
order by c.id,流水号

如果要处理大于2048的流水号,需要自己创建一个完整的流水号表做辅助
[此贴子已经被作者于2019/8/27 17:33:00编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1265 积分:7838 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2019/8/28 8:30:00 [只看该作者]

妥!解决了,谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
xndd
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:517 积分:4319 威望:0 精华:0 注册:2014/11/26 15:23:00
  发帖心情 Post By:2019/8/28 8:38:00 [只看该作者]

 另外有2个方法可以参考:
1 用excel,建一个数字列,从1拖动到x,x为sql查询出来的行数
2 把sql查询出来的列放入第二个列,然后条件比对,颜色标识

适合不懂程序编码的人使用

第二个方法,从系统获取需要判断的列,用程序循环比对

 回到顶部