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 ...
随机推荐
- 写个shell脚本搭载jenkins让你的程序部署飞起来
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html 作者:jstarseven 码字挺辛苦的..... 说明 ...
- SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet
转自:https://my.oschina.net/lichhao/blog SpringMVC简介 SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的 ...
- javaio字节流复制文件夹
public class Copy1 { public static void main(String[] args) throws IOException { File src=new File(& ...
- python 31 升级版解决粘包现象
目录 1. recv 工作原理 2.升级版解决粘包问题 3. 基于UDP协议的socket通信 1. recv 工作原理 1.能够接收来自socket缓冲区的字节数据: 2.当缓冲区没有数据可以读取时 ...
- Minimum spanning tree for each edge(倍增LCA)
https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...
- CodeForces 1018B The hat
The hat 题解: 定义d[i]为第i个数和他对面的差值. 然后我们可以发现d[i]和d[i+1]的差值只会有3种情况2, -2, 0. 并且可以知道 d[i] = - d[i+n/2] 所以如果 ...
- CodeForces 55D Beautiful numbers(数位dp+数学)
题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...
- poj 1182 食物链(种类并查集 ‘初心者’)
题目链接:http://poj.org/problem?id=1182 借着这题可以好好理解一下种类并查集,这题比较简单但挺经典的. 题意就不解释了,中问题. 关于种类并查集结局方法也是挺多的 1扩增 ...
- 拿 C# 搞函数式编程 - 1
最近闲下来了,准备出一个 C# 搞 FP 的合集.本合集所有代码均以 C# 8 为示例. 可能你说,为什么要这么做呢?回答:为了好玩.另外,意义党们请 gun cu ke! C# 有委托,而且有 Fu ...
- 基于WFST的语音识别解码器
学习语音识别有些时间了.老板要求我们基于Kaldi搭一个语音识别系统,在设备上通过MIC讲话,连着设备的PC的console上就能基本实时显示出讲话的内容.由于我们都是小白,刚开始可以要求低些,就用传 ...