- 浏览: 599720 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (263)
- Struts2 (3)
- Spring (15)
- Apache (11)
- Java (57)
- Hibernate (10)
- Oracle (19)
- Linux (27)
- MYSQL (2)
- JavaScript (15)
- WebService (4)
- XFire (4)
- FreeMarker (2)
- JXL (2)
- Eclipse (5)
- PowerDesigner (6)
- Intellij IDEA (7)
- JQuery (6)
- EL&JSTL (3)
- SpringMVC (7)
- JAR&TLD (1)
- CMD&BAT (1)
- CSS (2)
- axis (2)
- dom4j (1)
- SoapUI (1)
- HttpClient (2)
- FusionCharts (4)
- 百度地图Api进阶教程 (5)
- SQLSERVER (15)
- 网站安全 (1)
- CXF (3)
- 文件同步软件 (0)
- Maven (9)
- Solr (2)
- QRCode (1)
- JSON (1)
- Dubbo (6)
- log4j2 (1)
- MyBatis (4)
- JavaWeb (1)
- activiti (2)
- kettle (1)
- JVM调优 (9)
最新评论
-
_739677725:
4楼的兄弟 你有源码没有?如果有可不可以帮忙转发一份 邮箱: ...
JAVA线程根据给定URL生成网页快照 -
_739677725:
下载不了了
JAVA线程根据给定URL生成网页快照 -
rhyhhg5:
还有一些url,抓图片的时候会提示脚本错误什么的,什么情况?
JAVA线程根据给定URL生成网页快照 -
rhyhhg5:
为什么 给 有些url,就抓不了图片呢
JAVA线程根据给定URL生成网页快照 -
feng_tai_jun:
总结很好。
Java中获取类加载路径和项目根路径
聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。
其语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。
其语法为:
RANK ( expr [, expr]... ) WITHIN GROUP
( ORDER BY
expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
[, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
)
实例解析如下:
先建了张测试表
SQL> select * from test_a;
ID PLAYNAME SCORE
-------------------- -------------------- ----------
01 aa 100
02 aa 101
02 bb 99
03 bb 98
04 aa 101
02 aa 101
需求是,将score降序排序,打印所有字段,并且如果是同一个playname的score只取出最高分,如果这个playname获得过多个相同的最高分,则只取出其中一个(比如:aa获得过3次101,则只取其中一个),最终要的结果就是:
RK ID PALYNAME SCORE
---------- -------------------- -------------------- ----------
1 02 aa 101
1 02 bb 99
本来我想用max函数,结果直接就出来了:
SQL> select max(score),palyname from test_a group by palyname;
MAX(SCORE) PALYNAME
---------- --------------------
101 aa
99 bb
但是要打印所有字段…OTL
即使用了嵌套,还是无法解决重复重现最高分的现象:
SQL> select distinct * from test_a t where score in (select max(score) from test_a group by palyname) order by score desc;
ID PALYNAME SCORE
-------------------- -------------------- ----------
02 aa 101
04 aa 101
02 bb 99
由于相同的playname对应的id不同,所以用distinct也无法过滤掉相同playname的并列最高分。
于是只好用rank()了
Rank的基本语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
例子1:
TABLE:A (科目,分数)
数学,80
语文,70
数学,90
数学,60
数学,100
语文,88
语文,65
语文,77
现在我想要的结果是:(即想要每门科目的前3名的分数)
数学,100
数学,90
数学,80
语文,88
语文,77
语文,70
那么语句就这么写:
select * from (select rank() over(partition by 科目 order by 分数 desc) rk,a.* from a) t
where t.rk<=3;
以科目来分组,然后以分数来排序,给排序的结果分配rank,取前三名的rank
例子2:
有表Table内容如下
COL1 COL2
1 1
2 1
3 2
3 1
4 1
4 2
5 2
5 2
6 2
分析功能:列出Col2分组后根据Col1排序,并生成数字列。比较实用于在成绩表中查出各科前几名的信息。
SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;
结果如下:
COL1 COL2 Rank
1 1 1
2 1 2
3 1 3
4 1 4
3 2 1
4 2 2
5 2 3
5 2 3
6 2 5
这个例子更直观一点,根据col2分组,根据clo1排序,我们可以发现:
5 2 3
5 2 3
6 2 5
即,如果两行记录完全相同,他们会被给予相同的rank,而排在它们之后的那行记录,由于前面的并列第3,使得之后的那条记录变成了第5,而如果我们在这里用的是dense_rank,那么之后的那条会变成第4
例子3:
合计功能:计算出数值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以后的位置
SELECT RANK(4,1) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;
结果如下:
Rank
4
通过以上方法,得出col1为4,col2为1的那行数据的rank排名为多少
Dense_rank的例子:
dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过
例如:表
A B C
a liu wang
a jin shu
a cai kai
b yang du
b lin ying
b yao cai
b yang 99
例如:当rank时为:
select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 4
而如果用dense_rank时为:
select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m
A B C LIU
a cai kai 1
a jin shu 2
a liu wang 3
b lin ying 1
b yang du 2
b yang 99 2
b yao cai 3
那么再回到之前的那个需求,
SQL> select distinct * from (select rank() over(partition by playname order by score desc,id) rk,t.* from test_a t) where rk=1;
RK ID PLAYNAME SCORE
---------- -------------------- -------------------- ----------
1 02 aa 101
1 02 bb 99
这里order by score desc,id 以score降序和id这两个字段排序,也就是说,正因为相同的playname对应的id不同,这样相同的playname,相同的score,但是不同的id,这样的2行数据就获得了不同的rank,而rk=1,即是只取rank=1,也就是最高分。这样就完成了需求。
发表评论
-
虚拟机上安装Oracle11gR2 PLSQL无法远程连接问题修复
2017-04-19 21:33 5781、关闭默认防火墙 systemctl stop fi ... -
oracle 小数格式化为百分数
2017-03-21 12:06 1806以下是从JAVAEYE中找到的代码,用途是将小数 转换为百分 ... -
SqlServer、Mysql和Oracle 添加修改删除字段
2015-10-14 14:04 572SqlServer(Transact-SQL): 添加单列 ... -
csv文件中的数据导入到oracle数据库中的方法
2015-07-13 14:16 1553当数据上百万条,使用PL/SQL中自带的导入工具,会很慢并 ... -
SSMA for Oracle 示例(Oracle数据迁移至SQLSERVER)
2015-03-26 13:39 1237参阅:http://blog.sina.com.cn/s/ ... -
JSP+Oracle实现简单的分页
2014-04-02 15:56 668oracle脚本:drop table t_student ... -
Oracle修改表空间为自动扩展
2014-02-12 15:42 702741.数据文件自动扩展的好处1)不会出现因为没有剩余空间可以 ... -
JDBC操纵Oracle数据库中的BLOB字段
2013-12-24 21:41 689... -
使用JDBC,Hibernate处理clob/blob字段
2013-12-24 21:35 9611、首先要知道的 (1)不同数据库中对应clob,blob ... -
ORACLE 多表关联 UPDATE 语句
2013-07-17 17:09 1067为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某 ... -
创建Database Link (DBLink)
2012-07-31 09:55 950有时候,需要在两个Oracle数据库之间手工同步数据时,DBL ... -
批量将PowerDesigner中表字段由小写变成大写
2012-06-18 13:48 1442由于建表的时候木有注意,在生产SQL时pd在列名上都加了“”这 ... -
Oracle 序列
2012-06-07 13:15 1010ORACLE没有象SQL SERVER中一 ... -
Oracle数据库索引
2011-12-31 14:42 1486索引是对数据库表中一列或多列的值进行排序的一种结构,使用索 ... -
Oracle 分析函数的使用
2011-12-08 15:04 810Oracle 分析函数使用介绍 分析函数是oracle81 ... -
Oracle 创建表空间和用户
2011-11-10 22:07 909Oracle安装完后,其中有一个缺省的数据库,除了这个缺省 ... -
oracle数据库文件中的导入\导出(imp/exp命令)
2010-07-30 15:38 1284Oracle数据导入导出imp/exp就相当于oracle ... -
用Pl*SQL将Excel中数据导入到oracle中
2010-07-30 14:39 2494(1)首先,可以不按照数据库中的字段存放顺序,编辑形成Exce ...
相关推荐
Oracle分析函数Rank、Dense_rank和row_number是用于处理数据集的高级工具,它们在数据库查询中发挥着关键作用,特别是在需要对数据进行排序和分组时。这三种函数都有各自的特点,适用于不同的业务场景。 1. **row_...
5. **聚合函数**: COUNT、SUM、AVG、MAX、MIN,用于对一组值进行统计。COUNT返回行数,SUM计算总和,AVG求平均值,MAX和MIN找出最大值和最小值。 6. **系统信息函数**: USER、DBMS_METADATA.GET_DDL等,用于...
最后,提供的文档和文本文件,如"oracle日期和时间处理汇总.doc"、"Oracle聚合函数RANK和dense_rank的使用.htm"等,都是极好的学习资源,可以深入研究每个函数的详细信息和示例。通过阅读和实践,你将能够充分利用...
* LISTAGG 函数可以与其他分析函数和聚合函数组合使用,以实现更加复杂的数据处理。 * LISTAGG 函数可以用于实现数据的分组和合并,提高数据处理的效率和简洁性。 * 在使用 LISTAGG 函数时,需要根据具体情况选择...
在Oracle数据库中,分析函数和聚合函数是SQL查询中用于处理和汇总数据的重要工具。本文将详细介绍两者的主要功能和用法。 首先,我们关注的是排名函数。在Oracle中,有三种常用的排名函数: 1. `RANK()`: 这个函数...
Oracle 分析函数中提供了多种聚合函数,包括: 3.1 AVG 函数 AVG 函数用于计算表达式的平均值。 3.2 CORR 函数 CORR 函数用于计算两个表达式之间的互相关性。 3.3 COUNT 函数 COUNT 函数用于计算表达式的计数...
在Oracle数据库中,分析函数主要分为评级函数、窗口函数和聚合函数等几类。本文将重点讨论评级函数的使用,包括RANK()、DENSE_RANK()、CUME_DIST()、PERCENT_RANK()和NTILE(),以及ROW_NUMBER()。 1. RANK() 函数:...
本文将详细介绍Oracle分析函数中的评级函数,包括RANK()、DENSE_RANK()、CUME_DIST()、PERCENT_RANK()和NTILE(),并结合示例进行解析。 1. RANK()函数: RANK()函数返回每个行在指定排序下的排名。如果两个或更多...
除了这些,Oracle分析函数还包括RANK、DENSE_RANK、ROW_NUMBER等排名函数,LEAD和LAG用于获取当前行之前或之后的值,FIRST_VALUE和LAST_VALUE则返回窗口内的第一个或最后一个值,以及NTILE用于将数据分桶等。...
Oracle分析函数是数据库查询中非常强大的工具,它们用于在数据集上执行聚合操作,并返回每个行的上下文信息。在Oracle数据库中,分析函数能够帮助我们处理复杂的分组和排序需求,尤其在报告和数据分析中非常有用。...
移动聚合函数如SUM和AVG可以在滑动窗口上进行计算,提供一种“移动”的累计或平均值。 ```sql SELECT BILL_MONTH, AREA_CODE, NET_TYPE, LOCAL_FARE, SUM(LOCAL_FARE) OVER (PARTITION BY ...
Oracle分析函数不同于聚合函数(如SUM、AVG、COUNT等),它们可以在单个查询中对分组数据进行计算,而不仅仅是简单地对整个结果集进行操作。分析函数可以对数据流进行窗口化处理,提供诸如排名、分段、累积计算等...
- 移动聚合函数允许你在特定窗口内计算累计和(`SUM`)或累计平均(`AVG`),比如计算过去N个月的总销售额或平均销售额。 5. **ratio_to_report 函数** - 这个函数用于计算某一行的值占整个分组总和的比例,对于...
这与聚合函数(如SUM, AVG, COUNT等)不同,聚合函数只考虑一组数据的汇总结果。 1. **Oracle分析函数简介** - 分析函数主要分为窗口函数和报表函数,它们都基于窗口的概念,但应用的场景有所不同。 - 窗口函数...
Oracle 分析函数是数据库查询中的一种强大工具,用于在数据集上执行聚合操作,同时保持行的原始顺序。本文将详细介绍其中的评级函数,包括RANK()、DENSE_RANK()、PERCENT_RANK()、CUME_DIST()以及NTILE(),并以实际...
- 分析函数不同于聚合函数(如SUM, AVG, COUNT等),因为聚合函数只返回单个值,而分析函数可以返回多行结果,且每行都包含根据特定分组或排序计算出的信息。 - 分析函数的主要特点是在处理数据时引入了“窗口”...
常见的等级函数包括`RANK()`, `DENSE_RANK()`, 和`ROW_NUMBER()`等。 - **RANK()**: 对每一行分配一个唯一的等级号。如果有两个或多个行具有相同的值,则它们将被分配相同的等级号,接下来的等级号将会跳过。 - *...
- 移动聚合函数:`SUM()`, `AVG()`, `MIN()`, `MAX()`等,在分析窗口内进行聚合计算。 - 移动平均:如`LEAD()`, `LAG()`, `CUME_DIST()`,提供向前或向后查看数据的能力,以及累积分布。 2. **Oracle分析函数简单...
优化的方法是使用Oracle的分析函数dense_rank()。在这个例子中,我们用它来计算每个owner的created日期的排名,然后只选择排名为1的记录,即最近一天的数据。分析函数的版本逻辑读降低到了423,COST降至693,这意味...