sql server 使用 partition by 分区函数 解决不连续数字查询问题
sql server表中的某一列数据为不一定连续的数字,但是需求上要求按照连续数字来分段显示,如:1,2,3,4,5,6,10,11,12,13,
会要求这样显示:1~6,10~13。下面介绍如何实现。
话不多说,直接上实例。
--创建测试表
CREATE TABLE PartitionTest
(
ID INT IDENTITY(1,1) PRIMARY KEY,
KeyID INT ,--标识ID
Num INT --号码
)
--插入数据,KeyID不同
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8000 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8001 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8002 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8003 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8004 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8005 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8006 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 1, 8007 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9000 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9001 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9002 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9003 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9004 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9005 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9006 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 2, 9007 )
--在KeyID不同的情况下,很容易就能查出这样的数据
SELECT KeyID,CONVERT(VARCHAR(10),MIN(Num))+'~'+CONVERT(VARCHAR(10),MAX(Num)) AS PartNum FROM dbo.PartitionTest WHERE KeyID IN(1,2) GROUP BY KeyID

--插入数据,KeyID相同
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1000 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1001 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1002 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1003 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1004 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1005 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1006 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 1007 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4000 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4001 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4002 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4003 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4004 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4005 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4006 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 4007 )
INSERT INTO dbo.PartitionTest(KeyID, Num ) VALUES ( 3, 5007 )
--KeyID相同的情况下,上面的查询语句无法查出需求中想要的数据
SELECT KeyID,CONVERT(VARCHAR(10),MIN(Num))+'~'+CONVERT(VARCHAR(10),MAX(Num)) AS PartNum FROM dbo.PartitionTest WHERE KeyID IN(3) GROUP BY KeyID

--利用Partition BY可以查出每一段连续数字的分组,可以利用GroupNum进行分组
SELECT
KeyID,
Num,
ROW_NUMBER() over(Partition BY KeyID ORDER BY num ) NewNum,
Num-ROW_NUMBER() over(Partition BY KeyID ORDER BY num ) GroupNum
FROM dbo.PartitionTest WHERE KeyID IN (3)

--这样写,就能达到需求的要求
SELECT t.KeyID,
CASE WHEN COUNT(NewNum)>1THEN CONVERT(VARCHAR(10),MIN(t.Num))+'~'+CONVERT(VARCHAR(10),MAX(t.Num)) ELSE CONVERT(VARCHAR(10),MIN(t.Num)) END PartNum
FROM (
SELECT
KeyID,
Num,
Num-ROW_NUMBER() over(Partition BY KeyID ORDER BY num ) NewNum
FROM dbo.PartitionTest WHERE KeyID IN (3)
) t GROUP BY t.KeyID,t.NewNum

以上代码可以直接拿到数据库执行进行测试噢,喜欢的点个赞吧!!!
sql server 使用 partition by 分区函数 解决不连续数字查询问题的更多相关文章
- sql server 2005中的分区函数用法(partition by 字段)
分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...
- SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题
用户定义函数(UDF)分类 SQL SERVER中的用户定义函数(User Defined Functions 简称UDF)分为标量函数(Scalar-Valued Function)和表值函数(T ...
- SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决 ...
- SQL Server统计信息:问题和解决方式
在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...
- SQL Server 2019 中标量用户定义函数性能的改进
在SQL Server中,我们通常使用用户定义的函数来编写SQL查询.UDF接受参数并将结果作为输出返回.我们可以在编程代码中使用这些UDF,并且可以快速编写查询.我们可以独立于任何其他编程代码来修改 ...
- SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- (转载)MS SQL Server 未公开的加密函数有哪些?
MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...
随机推荐
- JavaScript算法实现——排序
在计算机编程中,排序算法是最常用的算法之一,本文介绍了几种常见的排序算法以及它们之间的差异和复杂度. 冒泡排序 冒泡排序应该是最简单的排序算法了,在所有讲解计算机编程和数据结构的课程中,无一例外都会拿 ...
- java 正则 替换中文为空
//中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...
- RSA加密的java实现
首先科普一波: RSA的1024位是指公钥及私钥分别是1024bit,也就是1024/8=128 Bytes RSA算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加密解密所 ...
- time_wait状态如何处理和建议
TL;DR: do not enable net.ipv4.tcp_tw_recycle. UPDATED (2017.09): net.ipv4.tcp_tw_recycle has been re ...
- jvm系列(四):jvm调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎鼎的VisualVM,IBM的Memory Analyzer ...
- unity_小功能实现(敌人追踪主角)
1.敌人发现主角有两种形式: a.看见主角(主角出现在敌人的视野之内) b.听见主角(听见主角走路声或者是跑步声) a:看(see) 首先判断主角是否在敌人视野角度内,那么我们只需要判断B<0. ...
- Java8 日期 API 业务使用
最近在做账单结算业务,需要根据客户选择的结算方式来推算下一次结算日期以及该次结算日期段. 推算日期这样的业务直男君以前就写过,只不过使用的是熟悉的 java.util.date 和 java.util ...
- visual studio code 应用到.net core 实战
鉴于visual studio 2019 近期动不动卡顿与切分支后F12等功能失效的问题,开始考虑用visual studio code 代替他,对,你没有看错,就是代替visual studio 这 ...
- Gym 101482 题解
B:Biking Duck 题意:现在有一个人要从(x1,y1)点走到(x2,y2)点, 现在走路的速度为v. 还有骑自行车的速度v2,自行车要从某个自行车站到另一个自行车站,现在我们可以视地图的边界 ...
- vim 同时操作多行
使用 vim 的时候,经常会有同时注释或解开注释的情况,逐行编辑很浪费时间,下面的同时操作多行的方式 删除操作 control+v 进入 visual block 模式 选中要删除几行文字 d删除 插 ...