首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >db2排序rownumber函数讨论[通俗易懂]

db2排序rownumber函数讨论[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-06 16:00:15
发布2022-09-06 16:00:15
2.4K0
举报

大家好,又见面了,我是你们的朋友全栈君。

在我的应用中使用了Rownumber函数,由于我的非正常理解造成了排序混乱。现在晒出来讨论。

一、初识rownumber rownumber() 函数允许开发人员动态地将行号指定给结果集。 如果去掉 row_next 子句( ROW_NEXT BETWEEN ? and ? ),那么将返回所有匹配选择标准的行。 上面使用的 SELECT * FROM 子句可以看作一个 临时表,里面存有匹配选择标准的整个结果集,然后从这个临时表中返回落在给定行范围内的结果集。 使用 rownumber() 功能时对系统会有额外的 性能影响,因为数据库首先要获取所有匹配选择标准的行,然后再返回落在给定范围内的那些行。

我们遇到的性能问题就是系统在排序时建的临时表过大,我们采用建一个裸设备的表空间。

二、犯错展示 所以呢,我直观的认为rownumber是对我传的结果集取分页游标。我就将结果集排好序给不减少临时表利用空间吗。sql如下:

Java代码

代码语言:javascript
复制
 select * from (select .... rownumber() over() as rn from photo_ref where ... order by storetime desc )as a1 where a1.rn between 0 and 3000

出来的结果有问题了,分页起始游标每次都不在一个位置,但结果集是正确排序的。 比较正确用法的sql:

Java代码

代码语言:javascript
复制
 select * from (select .... rownumber() over(order by storetime desc) as rn from photo_ref where ...  )as a1 where a1.rn between 0 and 3000

可见必须在over()中排序,那就好好查查原因吧。

三、找到原因 db2有3个排序函数,rank如果出現两个相同的数据,那么后面的数据就会直接跳过这个排名,而dense_rank则不会,差別更大的是,row_number哪怕是两个数据完全相同,排名也会不一样。 1、rank rank 函数本身没有参数。这是因为 rank 函数不对任何参数执行任何计算。相反,rank 函数只是着眼于行集合–以及每一行在集合中的位置–正如排序方式所定义的那样。 对排列函数的而言, 分区(partition) 和 集合(set)这两个术语是等价的。在 PARTITION 子句后面,我们有一个 ORDER BY 子句,这个子句定义了分区内的排序方式。 2、row_number Row_number 也执行一次排列,但是当碰到有结的情况时,结中的行要进行任意的(也就是说,不是确定的)排序。这在对有重复值的数据进行分析时很有用。row_number 函数一个有趣的方面是它是惟一不要求提供排序方式的排列函数。如果在没有指定排序方式的情况下调用 row_number 函数,则所有的行都将被当作结中的行来对待,因而这些行是 任意排序的。这对于在输出中给行排序来说很有用。

四、结论 所以,我开始的想法错了。不错、努力、继续、希望。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134439.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档