查看: 7724|回复: 11

[精华] DB2 V9.5 ROWNUMBER/RANK 学习笔记

[复制链接]
求职 : 数据库管理员
论坛徽章:
186
授权会员
日期:2008-07-27 22:25:202014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14版主4段
日期:2015-02-26 02:21:03慢羊羊
日期:2015-03-04 14:51:35
跳转到指定楼层
1#
发表于 2008-11-20 12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天发现对 ROWNUMBER/RANK  函数使用不熟练,
特别加强了一下,
以下通过各个实例,来强化对 ROWNUMBER/RANK  函数
用法的理解,
关键部分已用蓝色标出,
特放上来与大家分享

ROWNUMBER / ROW_NUMBER
RANK / DENSE_RANK



测试环境:
DB2 V9.5 SAMPLE

求:员工的收入排名(收入大于30000的)
1. 按名称排
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
       RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
     FROM EMPLOYEE WHERE SALARY+BONUS > 30000
     ORDER BY LASTNAME
也可以按 收入排
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
       DENSE_RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
     FROM EMPLOYEE WHERE SALARY+BONUS > 30000
     ORDER BY RANK_SALARY

SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
       DENSE_RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
     FROM EMPLOYEE WHERE SALARY+BONUS > 30000
     ORDER BY RANK() OVER (ORDER BY SALARY+BONUS DESC)


2. 求按部门员工的平均收入的排名
SELECT WORKDEPT, AVG(SALARY+BONUS) AS AVG_TOTAL_SALARY,
       RANK() OVER (ORDER BY AVG(SALARY+BONUS) DESC) AS RANK_AVG_SAL
     FROM EMPLOYEE
     GROUP BY WORKDEPT
     ORDER BY RANK_AVG_SAL


3. 求每个部门内部按教育程度的排名
SELECT WORKDEPT, EMPNO, LASTNAME, FIRSTNME, EDLEVEL,
       DENSE_RANK() OVER
         (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS RANK_EDLEVEL
     FROM EMPLOYEE
     ORDER BY WORKDEPT, RANK_EDLEVEL


4. 为查询提供结果提供ROWNUMBER
SELECT LASTNAME, SALARY,
        ROW_NUMBER() OVER (ORDER BY WORKDEPT, LASTNAME) AS NUMBER
    FROM EMPLOYEE
    ORDER BY WORKDEPT, LASTNAME


5. 求收入最高的前5名员工
SELECT
EMPNO, LASTNAME, FIRSTNME, TOTAL_SALARY, RANK_SALARY
FROM (
    SELECT EMPNO, LASTNAME, FIRSTNME,
        SALARY+BONUS AS TOTAL_SALARY,
        RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
    FROM EMPLOYEE
    ) AS RANKED_EMPLOYEE
WHERE RANK_SALARY < 6
ORDER BY RANK_SALARY


6. 求每个部内的员工与本部门内工资最相近的员工之间的工资差
SELECT EMPNO, WORKDEPT, LASTNAME, FIRSTNME, JOB, SALARY,
    LEAD(SALARY, 1) OVER (PARTITION BY WORKDEPT
        ORDER BY SALARY) - SALARY
            AS DELTA_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT, SALARY
或者:
SELECT EMPNO, WORKDEPT, LASTNAME, FIRSTNME, JOB, SALARY,
   SALARY - LEAD(SALARY, 1) OVER (PARTITION BY WORKDEPT
        ORDER BY SALARY DESC)
            AS DELTA_SALARY
FROM EMPLOYEE
ORDER BY WORKDEPT ASC, SALARY DESC

参考:
LEAD 函数语法:
lead-function

|--LEAD--(--expression------------------------------------------>
>--+-------------------------------------------------------------+--)--|
   '-,--offset--+----------------------------------------------+-'      
                '-,--default-value--+------------------------+-'        
                                    '-,--+-'RESPECT NULLS'-+-'         
                                         '-'IGNORE NULLS'--'
            

说明:
The LEAD function returns the expression value for the row at offset rows after the current row. The offset must be a positive integer (SQLSTATE 42815). An offset value of 0 means the current row. If a window-partition-clause is specified, offset means offset rows after the current row and within the current partition. If offset is not specified, the value 1 is used. If default-value (which can be an expression) is specified, it will be returned if the offset goes beyond the scope of the current partition. Otherwise, the null value is returned. If 'IGNORE NULLS' is specified, all rows where the expression value for the row is the null value are not considered in the calculation. If 'IGNORE NULLS' is specified and all rows are null, default-value (or the null value if default-value was not specified) is returned.

7. 计算出每个员工的薪资 与 相同工作的、最早入职的 员工的薪资的差
SELECT JOB, HIREDATE, EMPNO, LASTNAME, FIRSTNME, SALARY,
    FIRST_VALUE(SALARY) OVER (PARTITION BY JOB
        ORDER BY HIREDATE) AS FIRST_SALARY,
    SALARY - FIRST_VALUE(SALARY) OVER (PARTITION BY JOB
        ORDER BY HIREDATE) AS DELTA_SALARY
FROM EMPLOYEE
ORDER BY JOB, HIREDATE

参考:
first-value-function:

|--FIRST_VALUE--(--expression--+------------------------+--)----|
                               '-,--+-'RESPECT NULLS'-+-'      
                                    '-'IGNORE NULLS'--'         

last-value-function:

|--LAST_VALUE--(--expression--+------------------------+--)-----|
                              '-,--+-'RESPECT NULLS'-+-'      
                                   '-'IGNORE NULLS'--'        

说明:
The FIRST_VALUE function returns the expression value for the first row in an OLAP window. If 'IGNORE NULLS' is specified, all rows where the expression value for the row is the null value are not considered in the calculation. If 'IGNORE NULLS' is specified and all values in the OLAP window are null, FIRST_VALUE returns the null value.

The LAST_VALUE function returns the expression value for the last row in an OLAP window. If 'IGNORE NULLS' is specified, all rows where the expression value for the row is the null value are not considered in the calculation. If 'IGNORE NULLS' is specified and all values in the OLAP window are null, LAST_VALUE returns the null value.

The data type of the result of FIRST_VALUE, LAG, LAST_VALUE, and LEAD is the data type of the expression. The result can be null.
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
2#
发表于 2008-11-20 12:26 | 只看该作者
原创?俺来授精

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
3#
发表于 2008-11-20 13:04 | 只看该作者
上9.5的啦~!

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
186
授权会员
日期:2008-07-27 22:25:202014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14版主4段
日期:2015-02-26 02:21:03慢羊羊
日期:2015-03-04 14:51:35
4#
 楼主| 发表于 2008-11-20 13:15 | 只看该作者
半个月前 系统全面升级至 V9.5.2,
DB2 V9.5 变化还是比较大的,
偶正在恶补中

使用道具 举报

回复
论坛徽章:
1
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22
5#
发表于 2008-11-24 13:07 | 只看该作者
学习~

使用道具 举报

回复
论坛徽章:
23
授权会员
日期:2008-05-27 16:24:122009日食纪念
日期:2009-07-22 09:30:002009日食纪念
日期:2009-07-22 09:30:00ITPUB元老
日期:2010-06-11 19:39:16ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31灰彻蛋
日期:2013-01-18 18:09:59鲜花蛋
日期:2013-02-21 11:25:372013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-10-08 14:59:19马上有对象
日期:2014-12-12 13:01:19
6#
发表于 2009-1-9 16:00 | 只看该作者
帮顶一下 。。 呵呵

使用道具 举报

回复
论坛徽章:
5
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:282011新春纪念徽章
日期:2011-02-18 11:43:33
7#
发表于 2009-1-9 18:01 | 只看该作者

学会了 lead(),first_value(),last_value()

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
8#
发表于 2009-1-9 18:10 | 只看该作者
oracle 早都有这几个函数了
而db2才是在9.5的时候补上...

唉~!

使用道具 举报

回复
论坛徽章:
5
2009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:08:29ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
9#
发表于 2009-1-11 13:39 | 只看该作者
原帖由 myfriend2010 于 2009-1-9 18:10 发表
oracle 早都有这几个函数了
而db2才是在9.5的时候补上...

唉~!


感觉IBM喜欢高难度的xml数据库
这些小技巧是不是不屑去更新
呜~~~

使用道具 举报

回复
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010广州亚运会纪念徽章:橄榄球
日期:2011-05-22 10:54:33管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010年世界杯参赛球队:丹麦
日期:2010-04-06 10:23:36
10#
发表于 2009-1-11 20:49 | 只看该作者
db2的sql更符合ansi的标准而以

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表