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 函数,则所有的行都将被当作结中的行来对待,因而这些行是
任意排序的。这对于在输出中给行排序来说很有用。

四、结论

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

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

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

(0)
上一篇 2022年6月6日 下午8:16
下一篇 2022年6月6日 下午8:36


相关推荐

  • webbench源码分析_webpack原理和机制

    webbench源码分析_webpack原理和机制webbench是一种网站的压力测试工具,它是由Lionbridge公司开发,wenbench的标准测试可以向我们展示两项内容:每秒钟相应的请求数和每秒钟传输的数据量;。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,Java,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。Webbench最多可以模拟3

    2025年6月10日
    6
  • CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿

    CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿安装以太坊源码,即安装GoEthereum(安装Geth)1、安装Golang可以直接使用yum这个包管理器安装Golangyuminstallgolang2、下载以太坊源码(GoEthereum)首先下载geth源码go-ethereum,这里以go-ethereum-1.9.7.tar.gz,直接在GitHub下载3、安装以太坊源码(安装Geth)接下来解压源码:tar-xzfgo-ethereum-1.9.7.tar.gz用下…

    2022年8月31日
    5
  • php 覆盖率_java代码覆盖率工具

    php 覆盖率_java代码覆盖率工具简介:最近研究了PHP代码覆盖率的测试,后面发现了github一个开源项目(https://github.com/sebastianbergmann/php-code-coverage),对PHP代码覆盖率测试已经做得很好了,所以拿来直接用,这里总结怎么用这个开源项目。环境搭建一、安装php环境1、php要选高版本,亲测7.27可行,5.5就不行二、安装xdebug这个直接网上搜怎么安…

    2022年10月2日
    4
  • keypad 错误

    keypad 错误always@(posedgeCLKornegedgenRESET)beginif(!nRESET)beginendelsebeginif(key_en)begincase(key_value_1)7’b0001_001:key_value7’b0010_001:key_value7’b0100_001:key_valu

    2022年6月3日
    36
  • VScode如何使用deepseek详细教程

    VScode如何使用deepseek详细教程

    2026年3月16日
    2
  • idea2021.8永久激活码_在线激活

    (idea2021.8永久激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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