Oracle分析函数KEEP、DENSE_RANK的使用
2014-10-27 17:31
260 查看
最近在工作中,碰到一个问题,后来在处理过程中接触到了KEEP,DENSE_RANK分析函数,问题瞬间被简单的解决,否则按照常规写法,肯定会写出嵌套语句,但是网上对这个方面的介绍比较少,现在特整理了一下:
从目前查到的来看:DENSE_RANK是和KEEP结合使用的,网上给出的解释是Returns the row ranked first
using DENSE_RANK。我的理解是返回 DENSE_RANK函数的第一结果。一般写法是
MIN [ MAX ] (A) KEEP(DENSE_RANK FIRST [ LAST ] ORDER BY B),这里引用别人说的明的解释一下:
DENSE_RANK
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数。
FIRST
功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
LAST
功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
所以默认排序下,FIRST可以理解是取小值,LAST取大值。而前面的MIN或者MAX则是在KEEP的结果集中取某一字段的最大值或最小值。
语文没学好
上面的可能没说清楚,而且网上的相关的资料也少,所以最后给大家看一个完整的SQL语句并解释一下作用,大家自己理解一下吧....
表结构大概如下:
其中相同ZGH对应的字段WM、RQ值可能有多条,要求从中取出WM值最小的那一条,但可能存在多条,这时要取出其中RQ最小的那一条,以上语句可以实现。
最后取出的值应该是:
从目前查到的来看:DENSE_RANK是和KEEP结合使用的,网上给出的解释是Returns the row ranked first
using DENSE_RANK。我的理解是返回 DENSE_RANK函数的第一结果。一般写法是
MIN [ MAX ] (A) KEEP(DENSE_RANK FIRST [ LAST ] ORDER BY B),这里引用别人说的明的解释一下:
DENSE_RANK
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数。
FIRST
功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
LAST
功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。
所以默认排序下,FIRST可以理解是取小值,LAST取大值。而前面的MIN或者MAX则是在KEEP的结果集中取某一字段的最大值或最小值。
语文没学好
上面的可能没说清楚,而且网上的相关的资料也少,所以最后给大家看一个完整的SQL语句并解释一下作用,大家自己理解一下吧....
SELECT ZGH, MIN(WM) KEEP(DENSE_RANK FIRST ORDER BY WM), MIN(RQ) KEEP(DENSE_RANK FIRST ORDER BY WM) FROM T_JZG GROUP BY ZGH
表结构大概如下:
ZGH | WM | RQ |
A | 1 | 20130101 |
A | 2 | 20140102 |
A | 1 | 20120102 |
B | 3 | 20131001 |
B | 2 | 20140102 |
B | 3 | 20121004 |
最后取出的值应该是:
ZGH | WM | RQ |
A | 1 | 20120102 |
B | 2 | 20140102 |
相关文章推荐
- Oracle分析函数KEEP、DENSE_RANK的使用
- 数据库SQL中对查询结果排序排列序号编号,Oracle分析函数 rank,dense_rank,row_number使用和区别
- oracle的“over partition by”的用法,over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
- 使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK
- Oracle分析函数-keep(dense_rank first/last)
- Oracle分析函数(2) keep(dense_rank first/last) FIRST_VALUE() LAST_VALUE()
- 如何使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK
- 使用Oracle的分析函数ROW_NUMBER、DENSE_RANK、RANK
- oracle 分析函数 keep(dense_rank first/last)
- Oracle:分析函数2(Rank, Dense_rank, row_number)
- Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
- Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
- Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 【转】
- over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用
- oracle rank/dense_rank/row_number 等分析函数总结
- oracle分析函数row_number、dense_rank、rank的区别
- Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法(转载)
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number)
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 【转】