`
king1065
  • 浏览: 4136 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

db2排序rownumber函数讨论

阅读更多
   在我的应用中使用了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 ... order by storetime desc )as a1 where a1.rn between 0 and 3000 
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代码
1.select * from (select .... rownumber() over(order by storetime desc) as rn from photo_ref where ...  )as a1 where a1.rn between 0 and 3000 
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 函数,则所有的行都将被当作结中的行来对待,因而这些行是任意排序的。这对于在输出中给行排序来说很有用。
    
     四、结论
     所以,我开始的想法错了。不错、努力、继续、希望。
分享到:
评论

相关推荐

    (开发人员应当读的文章)Bob Lyle 谈 DB2 中的 OLAP 函数

    排列函数主要包括`RANK()`、`DENSE_RANK()`以及`ROW_NUMBER()`三个函数。这些函数的主要作用是基于特定条件对数据进行排序,并分配排名或行号。 - **RANK()**函数:返回每组内按指定顺序排列的数据项的排名。如果...

    DB2到GreenPlum/PostgreSQL的转换指南

    ROW_NUMBER函数用于为每一行分配唯一的行号,而ROLLUP用于分组计算的汇总。这两种数据库系统都支持这些功能,但在某些细节上可能存在差异。 #### 2.8 标量函数 标量函数用于执行简单的数学、字符串或其他类型的运算...

    oracle的分析函数over 及开窗函数

    1. 使用`ROW_NUMBER()`函数时,如果有并列的第一名,则只会返回其中一个结果。 2. `RANK()`函数与`DENSE_RANK()`函数的区别在于,当有并列排名时,`RANK()`会跳过下一个排名,而`DENSE_RANK()`则不会。 ##### 3. ...

    db2编写的存储过程分页

    - **使用ROW_NUMBER()函数**:DB2中的`ROW_NUMBER()`函数用于为每一行分配唯一的编号,这在实现分页查询时非常有用。 - **动态SQL**:通过动态构建SQL语句,该存储过程可以适应不同的表结构和查询需求。 - **异常...

    IBM DB2通用数据库SQL入门

    4. **窗口函数**:如RANK()、ROW_NUMBER()、LAG()和LEAD(),用于在结果集内进行复杂的计算和排序。 5. **JOIN操作**:支持多种JOIN类型,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。 6. **子查询**:...

    db2学习笔记(个人总结)

    然而,DB2在某些版本中不支持`OFFSET`,这时可以使用`ROW_NUMBER()`函数配合子查询来实现分页效果。 Oracle数据库提供了`ROWNUM`伪列进行分页,其用法如下: ```sql SELECT * FROM ( SELECT a.*, ROWNUM rnum ...

    各数据库分页语法支持

    DB2 支持两种分页方法:使用 ROW_NUMBER() 函数和 FETCH FIRST ROWS ONLY 语法。 1. **ROW_NUMBER() 函数分页**: ```sql SELECT * FROM ( SELECT sid, ROW_NUMBER() OVER (ORDER BY sid) AS ROWNUM FROM test...

    数据库分页大全及示例

    SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber, * FROM table1 ) A WHERE RowNumber > 页大小*(页数-1) ``` **DB2分页**: DB2不支持`LIMIT`关键字,但可以使用`ROW_NUMBER()`函数实现分页: ```sql ...

    IBM+DB2数据库的SQL手册

    4. **窗口函数**:如ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG()等,提供基于行序的计算和分析功能。 5. **存储过程和触发器**:存储过程是一组预先编译的SQL语句,可提高效率和安全性;触发器在特定事件...

    开窗函数有浅入深详解(一)

    - ORDER BY:确定组内行的顺序,这对于RANK和ROW_NUMBER等函数尤为重要,因为它们基于排序结果分配序列号。 例如,如果我们想找出每个城市的最高薪资,可以使用开窗函数: ```sql SELECT FName, FCity, FAge, ...

    DB2 SELECT语句高级用法

    分析函数如`RANK`, `DENSE_RANK`, `ROW_NUMBER`, `LEAD`, `LAG`等,可以在结果集的每一行上执行计算,通常用于排名或获取相邻行的信息。 理解并熟练运用这些DB2 SELECT语句的高级特性,可以帮助你更有效地查询和...

    Oracle数据库中SQL开窗函数的使用

    开窗函数的其他常见功能还包括`ROW_NUMBER()`(生成唯一的行号)、`RANK()`(根据某个条件生成排名)、`DENSE_RANK()`(消除排名中的空缺)等。这些函数可以结合`ORDER BY`子句,以指定窗口的顺序。 总之,Oracle...

    oracle、mysql数据库分页参照.pdf

    数据库分页是数据库管理系统中一个常见的功能,用于在大量数据中高效地...DB2的`ROW_NUMBER()`提供了更灵活的排序选择,但可能对资源消耗稍高。在实际应用中,应根据具体场景和数据库性能优化策略选择合适的分页方案。

    SQL开窗函数的具体实现详解

    在2003年的ISO SQL标准中引入了开窗函数,随后被MSSQL Server、Oracle、DB2等主流数据库系统支持,但遗憾的是,MySQL目前还不支持。 开窗函数的核心在于定义一个“窗口”,这个窗口可以随着查询中的每一行变化,...

    SQL简单分页教程~~~详细

    SQL分页的核心是通过`ROW_NUMBER()`函数来生成每个数据行的序列号,再结合`BETWEEN`操作符来筛选出特定范围内的行。在SQL Server中,我们可以使用以下语法: ```sql SELECT * FROM ( SELECT ROW_NUMBER() OVER ...

    数据库分页查询语句

    DB2 支持使用 `ROWNUMBER()` 函数来进行分页。该函数会根据指定的排序规则为每行分配一个行号,之后可以通过 `BETWEEN` 条件来筛选出特定范围内的行。 **SQL 示例**: ```sql SELECT * FROM ( SELECT ROW_NUMBER()...

    jsp分页技术实现.docx

    DB2有rownumber()函数,而SQL Server则有其他的分页方法。 在Java Web应用程序中,为了简化分页代码,我们可以创建工具类。这里提到了两个工具类:PagedStatement和RowSetPage。PagedStatement是基于...

    Generic_SQL_Query

    这个查询首先使用`ROW_NUMBER()`函数为`customer`表中的每一行分配一个行号,然后外部查询通过`WHERE R 来筛选出前10行。`OVER (ORDER BY PKEY ASC)`部分定义了行号的分配依据,这里是按照`PKEY`列的升序排序。 ...

    各种数据库分页查询方法

    DB2采用`rownumber() over()`窗口函数进行分页。例如,`SELECT * FROM (SELECT 字段1, 字段2, ..., ROW_NUMBER() OVER(ORDER BY id DESC) AS rn FROM tablename WHERE ...) AS t1 WHERE t1.rn BETWEEN m AND n`。...

    SQL袖珍参考手册(第3版)

    - **窗口函数**: 如ROW_NUMBER、RANK等,用于对结果集进行排序和分组。 #### 五、适用人群 - **程序员**: 对SQL语言有基础了解的开发人员。 - **数据库管理员**: 负责维护数据库系统的专业人员。 - **学生与学习者*...

Global site tag (gtag.js) - Google Analytics