`
qinjingkai
  • 浏览: 259862 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

相对复杂oracle的查询语句

阅读更多

     最近和一个哥们聊起了他现在所做的项目,其向我大吐苦水!先说说他的情况,他现在做的是教育系统的项目,其中有一个业务是这样的,要给全校学生中每个科目的前三名发奖学金(所谓前三名就是考试成绩最好的三位了,这里不在赘述);他为这个sql 费了好长时间也没写出来,表的结构大体如下(无关字段省略):

     id    科目   分数

    1       语文   85

    2       语文   53

    3       语文  36

    4       语文  56

    5       语文 53

    6       数学   85

    7       数学   53

    8        数学  36

    9        数学  56

    10       数学  53

 ..................当然还有科目和很多记录了,这里不在细说了;我就问他了那 不好办,你创建多几张表(每个科目一张),对每一张表

 的科目进行order by然后取前面三条不就 ok了吗? 他说他也曾经这样想过,但被他们老大叼了一顿,他们老大的饿理由就是如果有100个科目的时候你是不是也建立100张表啊 ,是不是要执行100个 sql啊????...............很显然要表达的主要意思就是设计不好了!为此我查了好多资料终于搞定了,先顶一顶啊 ;大致的思路就是用oracle里面的rank()函数 ,以科目来分组,然后以分数来排序,给排序的结果分配rank,取前三名的rank

 

代码如下

1 建表语句

 

create table test_qjk_score(
stu int primary key,
subject varchar2(30),
mark int
);

 

 

insert into test_qjk_score(stu,subject,mark)values(1,'语文',85);
insert into test_qjk_score(stu,subject,mark)values(2,'语文',15);
insert into test_qjk_score(stu,subject,mark)values(3,'语文',25);
insert into test_qjk_score(stu,subject,mark)values(4,'语文',35);
insert into test_qjk_score(stu,subject,mark)values(5,'语文',45);
insert into test_qjk_score(stu,subject,mark)values(6,'语文',55);
insert into test_qjk_score(stu,subject,mark)values(7,'语文',65);
insert into test_qjk_score(stu,subject,mark)values(8,'语文',75);

insert into test_qjk_score(stu,subject,mark)values(9,'数学',83);
insert into test_qjk_score(stu,subject,mark)values(10,'数学',13);
insert into test_qjk_score(stu,subject,mark)values(11,'数学',23);
insert into test_qjk_score(stu,subject,mark)values(12,'数学',33);
insert into test_qjk_score(stu,subject,mark)values(13,'数学',43);
insert into test_qjk_score(stu,subject,mark)values(14,'数学',53);
insert into test_qjk_score(stu,subject,mark)values(15,'数学',63);
insert into test_qjk_score(stu,subject,mark)values(16,'数学',73);


insert into test_qjk_score(stu,subject,mark)values(17,'英语',87);
insert into test_qjk_score(stu,subject,mark)values(18,'英语',17);
insert into test_qjk_score(stu,subject,mark)values(19,'英语',27);
insert into test_qjk_score(stu,subject,mark)values(20,'英语',37);
insert into test_qjk_score(stu,subject,mark)values(21,'英语',47);
insert into test_qjk_score(stu,subject,mark)values(22,'英语',57);
insert into test_qjk_score(stu,subject,mark)values(23,'英语',67);
insert into test_qjk_score(stu,subject,mark)values(24,'英语',77);

 

 

执行

select * from (select rank() over(partition by subject order by mark desc) rk,test_qjk_score.* from test_qjk_score) T  where T.rk<=3;

 

就可以得到结果了,结果如下:

RK    STU           SUBJECT    MARK
1        9             数学    83
2       16            数学    73
3       15            数学    63
1       17           英语    87
2       24           英语    77
3      23            英语    67
1      1             语文    85
2      8             语文    75
3      7             语文    65

参考的文章为

http://downpour.iteye.com/blog/24445

http://space.itpub.net/13379967/viewspace-481811

对这两篇文章的作者表示感谢

 

 

 

分享到:
评论
2 楼 shiyiwan 2009-10-31  
row_number
1,2,3,4,5
rank
1,1,3,4,5
dense_rank
1,1,2,3,4
1 楼 lumi 2009-09-25  
rank()函数地球人都知道

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     数据查询语言 (Data Query Language, DQL) 是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。例如:SELECT(查询)  数据控制语言Data Controlling Language(DCL),用来...

    sql part2.docx

    1)多表连接语句可能冗长复杂,易读性差。 2)可能需要更多的CPU资源,一些复杂的连接算法消耗CPU和Memory。 3)只能在一个数据库中完成多表连接查询。 7.2.2多表连接中表的对应关系 1)一对一关系 将表一份为二,最...

    python学习MongoDB.txt

    缺点: 数据库往往需要指令或语句操作,相对复杂 几个概念 数据 :能够输入到计算机中并被识别处理的信息的集合 数据结构 :组成一个数据集合的数据之间的关系 数据库 :按照一定的数据结构,存储数据的仓库。...

    ORACLE PL/SQL 触发器编程篇介绍

    1.基本概念 两种功能:完成由数据库的完整性约束难以完成的复杂业务规则的约束;监视数据库的各种操作,实现审计功能。 触发器分为:DML触发器(对表或视图执行DML操作时触发),INSTEAD OF触发器(只定义在视图上,...

    AppFramework_V1.0_New

    &lt;br&gt;4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句; &lt;br&gt;5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式; &lt;br&gt;6、 提供代码生成...

    AppFramework_V1.0

    &lt;br&gt;4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句; &lt;br&gt;5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式; &lt;br&gt;6、 提供代码生成...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    &lt;br&gt;4、 提供了强大的QueryFilter类构造查询条件,使得实现数据查询不再需要编写复杂的SQL语句; &lt;br&gt;5、 提供类似IBatisNet的Sql模板功能,为复杂的查询统计提供较直观的开发模式; &lt;br&gt;6、 提供代码生成...

    数据库优化设计方案.doc

    反 规范化的好处是降低连接操作的需求、降低外码和索引数目,减少表的个数,从而提高 查询速度,这对于性能要求相对较高的数据库系统来说,能有效地改善系统的性能,但 相应的问题是可能影响数据的完整性,加快查询...

    asp.net知识库

    直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle ...

    asp学习相关资料大全

    以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员, 从不同的地点,以不同的接入方式(比如LAN, ...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关...EntityBean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。而不是...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    这是个小型的系统,从投入的人力,财力与物力来讲是非常小的,发布出去之需要注册域名就可以了,从节省人力方面,可以让管理人员从繁与复杂的工作中解脱出来,做更多的工作。 2.2.3. 管理可行性 有IP地址、用户名...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

Global site tag (gtag.js) - Google Analytics