我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQLServer中如何使用Partition By和row_number 函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQLServer中如何使用Partition By和row_number 函数

这期内容当中小编将会给大家带来有关SQLServer中如何使用Partition By和row_number 函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

首先呢我把表中的数据按照提交时间倒序出来:

“corp_name”就是分类的GUID(请原谅我命名的随意性)。 OK, 这里按照最开始的想法加上Group By来看一下显示效果:

呃,嗯。这尼玛和想象中的结果不一样啊,看来写代码还是要理性分析问题,意念是无法控制结果滴!

既然要求是不同分类的数据,除了使用Group By之外,还有别的函数能用吗?度娘了一下结果还真有,over(partition by )函数,那么它和平时用的Group By有什么区别呢? Group By除了对结果进行单纯的分组之外呢,一般都和聚合函数一起使用,Partition By也具有分组功能,属于Oracle的分析函数,在这里就不详细的不啦不啦不啦了。

看代码:

over(partition by corp_name order by submit_time desc ) as t 。就是按照corp_name分类并按时间倒序出来,"t" 这里一列呢就是不同corp_name类出现的次数,需求是只查询出不同分类的最新提交数据,那么我们只需要针对"t"再进行一次筛选即可:

好啦,结果已经出来,不求各位看官喜欢,但求看在我头像中的胸器望点个赞, 好人一生平安哦!!!

ps:SQL Server数据库partition by 与ROW_NUMBER()函数使用详解

关于SQL的partition by 字段的一些用法心得

先看例子:

if object_id('TESTDB') is not null drop table TESTDBcreate table TESTDB(A varchar(8), B varchar(8))insert into TESTDBselect 'A1', 'B1' union allselect 'A1', 'B2' union allselect 'A1', 'B3' union allselect 'A2', 'B4' union allselect 'A2', 'B5' union allselect 'A2', 'B6' union allselect 'A3', 'B7' union allselect 'A3', 'B3' union allselect 'A3', 'B4'

-- 所有的信息

SELECT * FROM TESTDBA  B-------A1 B1A1 B2A1 B3A2 B4A2 B5A2 B6A3 B7A3 B3A3 B4

-- 使用PARTITION BY 函数后

SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM FROM TESTDBA  B  NUM-------------A1 B1 1A1 B2 2A1 B3 3A2 B4 1A2 B5 2A2 B6 3A3 B7 1A3 B3 2A3 B4 3

可以看到结果中多出一列NUM 这个NUM就是说明了相同行的个数,比如A1有3个,他就给每个A1标上是第几个。

-- 仅仅使用ROW_NUMBER() OVER的结果

SELECT *,ROW_NUMBER() OVER(ORDER BY A DESC)NUM FROM TESTDB A  B   NUM------------------------A3 B7  1A3 B3  2A3 B4  3A2 B4  4A2 B5  5A2 B6  6A1 B1  7A1 B2  8A1 B3  9

可以看到它只是单纯标出了行号。

-- 深入一点应用

SELECT A = CASE WHEN NUM = 1 THEN A ELSE '' END,BFROM (SELECT A,NUM = ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) FROM TESTDB) TA  B---------A1 B1  B2  B3A2 B4  B5  B6A3 B7  B3  B4

接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用。

实例如下:

1.使用row_number()函数进行编号,如

select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer

原理:先按psd进行排序,排序完后,给每条数据进行编号。

2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下:

select DID,customerID,totalPrice,ROW_NUMBER() over(order by totalPrice) as rows from OP_Order

3.统计出每一个各户的所有订单并按每一个客户下的订单的金额 升序排序,同时给每一个客户的订单进行编号。这样就知道每个客户下几单了

如图:

代码如下:

select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order

4.统计每一个客户最近下的订单是第几次下的订单。

代码如下:

 with tabs as ( select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order  ) select MAX(rows) as '下单次数',customerID from tabs group by customerID

5.统计每一个客户所有的订单中购买的金额最小,而且并统计改订单中,客户是第几次购买的。

如图:

上图:rows表示客户是第几次购买。

思路:利用临时表来执行这一操作。

1.先按客户进行分组,然后按客户的下单的时间进行排序,并进行编号。

2.然后利用子查询查找出每一个客户购买时的最小价格。

3.根据查找出每一个客户的最小价格来查找相应的记录。

代码如下:

with tabs as  ( select ROW_NUMBER() over(partition by customerID order by insDT) as rows,customerID,totalPrice, DID from OP_Order )  select * from tabs where totalPrice in  ( select MIN(totalPrice)from tabs group by customerID  )

6.筛选出客户第一次下的订单。

思路。利用rows=1来查询客户第一次下的订单记录。

代码如下:

with tabs as ( select ROW_NUMBER() over(partition by customerID order by insDT) as rows,* from OP_Order ) select * from tabs where rows = 1 select * from OP_Order

7.rows_number()可用于分页

思路:先把所有的产品筛选出来,然后对这些产品进行编号。然后在where子句中进行过滤。

8.注意:在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by”的执行。

如下代码:

select  ROW_NUMBER() over(partition by customerID order by insDT) as rows, customerID,totalPrice, DID from OP_Order where insDT>'2011-07-22'

上述就是小编为大家分享的SQLServer中如何使用Partition By和row_number 函数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQLServer中如何使用Partition By和row_number 函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SQLServer中的row_number函数怎么使用

本文小编为大家详细介绍“SQLServer中的row_number函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQLServer中的row_number函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-03-07

SQL如何使用ROW_NUMBER() OVER函数生成序列号

这篇文章给大家介绍SQL如何使用ROW_NUMBER() OVER函数生成序列号,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER
2023-06-22

SQLServer RANK()排名函数如何使用

今天小编给大家分享一下SQLServer RANK()排名函数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体如下
2023-06-29

SQLServer中如何处理数学运算和函数

在 SQL Server 中,你可以使用内置的数学函数和操作符来处理数学运算。以下是一些常用的数学函数和操作符:加法:使用加号(+)操作符来执行两个数字字段的加法操作,例如:SELECT num1 + num2 FROM table_nam
SQLServer中如何处理数学运算和函数
2024-04-09

tensor.squeeze函数和tensor.unsqueeze函数如何使用

这篇文章主要介绍“tensor.squeeze函数和tensor.unsqueeze函数如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“tensor.squeeze函数和tensor.unsq
2023-07-05

PHP中startsWith()和endsWith()函数如何使用

PHP中startsWith()和endsWith()函数如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。例如:$str = |apples};echo startsWi
2023-06-04

Python中help()和dir()函数如何使用

Python中help()和dir()函数如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。问:说说Python中的help()和dir()函数?答:在Python中hel
2023-06-19

编程热搜

目录