• 首先做准备数据
  CREATE TABLE #tempsource(col NVARCHAR(100))

 INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')
INSERT INTO #tempsource (col) VALUES('')

  • 将数据转换成应该处理的数据格式
CREATE TABLE #temp(name NVARCHAR(50),colValue INT )  

 INSERT INTO #temp  SELECT LEFT(col,6) AS name ,SUBSTRING(col,7,LEN(col)) FROM #tempsource

  • 将数据进行排序分组
  select v1.colValue, (v1.colValue - v1.rownum) as delta  ,v1.name   INTO #tempSort
from
(
select Row_Number() OVER (ORDER BY name,colValue) as rownum,colValue ,name
from #temp
) v1

  • 找出连续的数字并分组
SELECT v2.name,delta,MIN(v2.colValue) as StartNum, max(v2.colValue) as EndNum,
max(v2.colValue)-min(v2.colValue)+1 as Count,ROW_NUMBER() OVER( ORDER BY v2.delta ASC ) AS rownum
INTO #tempContinuity
from #tempSort v2
--WHERE v2.colValue >=2
group by v2.name,v2.delta
ORDER BY StartNum

  • 跟据连续的信息找出不连续的数字并分组
SELECT tlx1.name,tlx1.EndNum+1 LostStartNum,tlx2.StartNum-1 AS LostEndNum,tlx2.StartNum-1 -(tlx1.EndNum+1)+1 LostCount
INTO #tempLost
FROM #tempContinuity AS tlx1
LEFT JOIN #tempContinuity AS tlx2 ON tlx1.rownum+1 = tlx2.rownum AND tlx2.name = tlx1.name
WHERE tlx2.StartNum IS NOT NULL
ORDER BY tlx1.delta

  • 将取得的信息进行组装成源格式进行显示
SELECT name +RIGHT(''+ CAST(StartNum AS NVARCHAR),5) AS StartNum ,name +RIGHT(''+ CAST(EndNum AS NVARCHAR),5) AS EndNum,Count FROM  #tempContinuity
SELECT name +RIGHT(''+ CAST(LostStartNum AS NVARCHAR),5) AS LostStartNum ,name +RIGHT(''+ CAST(LostEndNum AS NVARCHAR),5) AS LostEndNum,LostCount FROM #tempLost

  • 使用ForXml将其分组合并成一行
    SELECT name,STUFF((SELECT name +RIGHT(''+ CAST(StartNum AS NVARCHAR),5) +'-'+name +RIGHT(''+ CAST(EndNum AS NVARCHAR),5)+'|'+CAST(t.Count AS NVARCHAR) +';' FROM  #tempContinuity AS t WHERE t.name =v.name FOR XML PATH ('')),1,0,'') AS strCard
FROM #tempContinuity AS v
GROUP BY v.name

sql从某不连续的数字中将其分段并找出缺失的数字并分段的更多相关文章

  1. 一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

    数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们 ...

  2. 【Java】 剑指offer(2) 不修改数组找出重复的数字

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少 ...

  3. 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

    7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...

  4. 《剑指offer》第三_二题(不修改数组找出重复的数字)

    // 面试题3(二):不修改数组找出重复的数字 // 题目:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至 // 少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改 ...

  5. 【小米oj】找出单独的数字

    题目链接:https://code.mi.com/problem/list/view?id=2&cid=0&sid=26251#codearea 描述 给出N个数字.其中仅有一个数字出 ...

  6. 【Offer】[3-2] 【不修改数组找出重复的数字】

    题目描述 思路分析 Java代码 代码链接 题目描述 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的. 请找出数组中任意一个重复的数字,但不能修改输入的数组. ...

  7. 【剑指 Offer】03.1.不修改数组找出重复的数字

    找出数组中重复的数字. 在一个长度为 n + 1 的数组 nums 里的所有数字都在 1-n 的范围内.所以数组中至少有一个是重复的.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, ...

  8. 算法-找出与目标数字相同的digit组成的整数中比该数字大的数集中的最小数字

    题目: 给出1个正整数,找到用与这个数字相同的digit组成的整数中比这个数字大的数集中的最小数字.比如:12352874 的结果是 12354278 分析: 这道题目的考虑目标是数组的查找与排序. ...

  9. C#中的字符串处理——找出最长数字子串

    百度测试部2015年10月份的面试题之——字符串处理,找出最长的子串. 代码如下: private static string SelectNumberFromString(string input) ...

随机推荐

  1. DWZ在APS.NET WebForm中的使用(一)

    1.前言 在最近的项目开发中,使用到了前端框架DWZ.DWZ是一款较为优秀的后台管理界面框架,但官方发布的文档确实令人汗颜,简单几页了事,有点对自己的产品不负责任了.同时感谢网友石头的热心帮助,在我这 ...

  2. 【.NetRemoting-3】2015.09.18

    [Remoting程序的基本实现] [一]服务程序集 [1]服务对象必须要求继承[MBR,MarshalByRefObject] [二]服务端应用程序 [1]注册通道 [两种类型的通道] [A]发送请 ...

  3. C#同步数据库的数据到Neo4J

    数据组件采用https://github.com/Readify/Neo4jClient 在nuget里面有 需要注意的是 以下是示例代码: using System;using System.Col ...

  4. PDO扩展使用方法

    pdo扩展为php访问数据库提供了一个轻量级的一致接口,pdo提供了一个数据访问抽象层,这意味着不管使用哪种数据库,都可以使用相同的函数来查询和获取数据. $dbms='mysql'; //数据库类型 ...

  5. MyEclipse开发的java web项目在 Eclipse中无法识别

    不能识别项目解决办法 在eclipse下,右键项目properties   ->  project fac e ts 选中 Dynamic web module 选择后面的版本为 2.5(运行环 ...

  6. oracle 集合定义

    集合:是具有相同定义的元素的聚合.Oracle有两种类型的集合: 可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值. 嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限 ...

  7. 英特尔发布全新英特尔® INDE 2015工具套件

    2014年10月15日,英特尔发布了全新的英特尔® Integrated Native Developer Experience 2015工具套件(简称英特尔® INDE).该产品提供了一系列最佳工具 ...

  8. java 使用pem密钥进行RSA加解密

    1.使用openssl生成私钥和公钥 openssl下载地址:http://www.openssl.org/source openssl生成私钥命令:  genrsa -out rsa_private ...

  9. Linux回归篇-基础恶补

    前言:  LINUX在之前仅仅了解一些皮毛知识,最近计划深入研究大数据,LINUX当然少不了,所以借此良机将LINUX也顺带添加进入学习的目录之中.为了知识的全面性,本文先恶补一下LINUX的基础,作 ...

  10. CKEditor扩展插件:自动排版功能

    CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站. 如果还没接触过的可以看看, ...