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

db2排序rownumber函数讨论[通俗易懂] 在我的应用中使用了Rownumber函数,由于我的非正常理解造成了排序混乱。现在晒出来讨论。一、初识rownumberrownumber()函数允许开发人员动态地将行号指定给结果集。如果去掉row_next子句(ROW_NEXTBETWEEN?and?),那么将返回所有匹配选择标准的行。上面使用的SELECT*FROM子句可以看作一个临时表,里面存有匹配选

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

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

一、初识rownumber

rownumber() 函数允许开发人员动态地将行号指定给结果集。 如果去掉 row_next 子句( ROW_NEXT BETWEEN ? and ? ),那么将返回所有匹配选择标准的行。 上面使用的 SELECT * FROM 子句可以看作一个
临时表,里面存有匹配选择标准的整个结果集,然后从这个临时表中返回落在给定行范围内的结果集。

使用 rownumber() 功能时对系统会有额外的
性能影响,因为数据库首先要获取所有匹配选择标准的行,然后再返回落在给定范围内的那些行。

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

二、犯错展示

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

Java代码
复制代码

  1. select * from (select …. rownumber() over() as rn from photo_ref where … <STRONG>order by storetime desc </STRONG>)as a1 where a1.rn between 0 and 3000  

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

比较正确用法的sql:

Java代码
复制代码

  1. select * from (select …. rownumber() over(<STRONG>order by storetime desc</STRONG>) 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 函数,则所有的行都将被当作结中的行来对待,因而这些行是
任意排序的。这对于在输出中给行排序来说很有用。

四、结论

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python挖矿脚本代码_一个挖矿脚本

    python挖矿脚本代码_一个挖矿脚本遇到一台机器偶尔cpu使用率达到80%,触发告警。登录查看后一个sshd2程序导致cpu负载高仔细查看就知道和sshd是两个完全不同的进程,取名sshd2应该只是为了迷惑用户ps-ef查看到父进程是一个/tmp/javax/config.sh,这个文件在当前系统已经删除了,所以只能按照pid号通过lsof-pPID查看打开的文件句柄在/proc/PID/fd里面顺利找到执行脚本#!/bin…

  • 【Spring】总结Spring整合Mybatis的底层原理实现步骤[通俗易懂]

    【Spring】总结Spring整合Mybatis的底层原理实现步骤[通俗易懂]SpringMyBatisDao:数据访问层,提供让Service层调用的接口,更大的时候,Dao层可以是一个项目。sqlSession.getMapper();使用的是JDK的动态代理使用时自定注入的条件:要被Spring管理。被Spring管理的对象叫做Bean对象和Bean的区别:@Component注解表示将生成一个BeanBean就是一个Java对象,是Spring…

  • pycharm中运行lua脚本requier sys报错_pycharm怎么安装jupyter

    pycharm中运行lua脚本requier sys报错_pycharm怎么安装jupyterpycharm中运行jupyternotebook,首先需要安装:pipinstlljupyternotebook安装完成后在pycharm中新建一个ipynb文件如下图: 然后输入代码,但运行出现了一个问题:解决方法如下:在cmd中运行jupyternotebook,可以看到url和token弄完之后确实可以运行了,但是如果把cmd关掉之后又不能运…

  • linux安装yarn

    linux安装yarn这里介绍使用yum的方式:先要安装node.js,用node-v可以查看是否安装了node。1、添加yarn仓库wgethttps://dl.yarnpkg.com/rpm/yarn.repo-O/etc/yum.repos.d/yarn.repo2、安装yarnyum-yinstallyarn安装完成后,yarn-v可以查看版本。…

  • 运算符的优先级(从高到低)

    运算符的优先级(从高到低)java运算符优先级记忆口诀尊重原创:(口诀)转自http://lasombra.iteye.com/blog/991662     今天看到《java编程思想》中的运算符优先级助记口诀,不过“Ulcer Addicts Really Like C A lot”在中文语境下不好记。我试着写一个口诀: 单目乘除为关系,逻辑三目后赋值。 单目:单目运算符+ –(负数) ++ — 等 乘…

  • WPF布局之WrapPanel与StackPanel

    WPF布局之WrapPanel与StackPanel转载:https://www.cnblogs.com/Im-Victor/p/10565030.html三.WrapPanelWrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够是就会自动调整进行换行,后续排序按照从上至下或从右至左的顺序进行。Orientation——根据内容自动换行。当Horizontal选项看上去类似于Windows资源管理器的缩略图视图:元素是从左向右排列的,然后自上至下自动换行。Vertical选项看上去类似于Windows资源..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号