`

oralce中的分组排序

SQL 
阅读更多
目前有3张表
-----学生
CREATE TABLE student(
student_id NUMBER PRIMARY KEY,
student_name VARCHAR2(30) NOT NULL) 
insert into student value(student_id,student_name) values (1,'张三');
insert into student value(student_id,student_name) values (2,'李四');
insert into student value(student_id,student_name) values (3,'王五');
insert into student value(student_id,student_name) values (4,'赵六');
insert into student value(student_id,student_name) values (5,'刘七');
insert into student value(student_id,student_name) values (6,'陈八');

------分数
CREATE TABLE score(
score_id NUMBER PRIMARY KEY,
student_id NUMBER,
course_id NUMBER,
score NUMBER)
insert into score value(score_id,student_id,course_id,score) values (1,1,1,92);
insert into score value(score_id,student_id,course_id,score) values (2,1,2,93);
insert into score value(score_id,student_id,course_id,score) values (3,1,3,94);
insert into score value(score_id,student_id,course_id,score) values (4,2,1,93);
insert into score value(score_id,student_id,course_id,score) values (5,2,2,92);
insert into score value(score_id,student_id,course_id,score) values (6,2,3,91);
insert into score value(score_id,student_id,course_id,score) values (7,3,1,92);
insert into score value(score_id,student_id,course_id,score) values (8,3,2,94);
insert into score value(score_id,student_id,course_id,score) values (9,3,3,95);
insert into score value(score_id,student_id,course_id,score) values (10,4,1,96);
insert into score value(score_id,student_id,course_id,score) values (11,4,2,97);
insert into score value(score_id,student_id,course_id,score) values (12,4,3,94);
insert into score value(score_id,student_id,course_id,score) values (13,5,1,98);
insert into score value(score_id,student_id,course_id,score) values (14,5,2,91);
insert into score value(score_id,student_id,course_id,score) values (15,5,3,90);
insert into score value(score_id,student_id,course_id,score) values (16,6,1,97);
insert into score value(score_id,student_id,course_id,score) values (17,6,2,99);
insert into score value(score_id,student_id,course_id,score) values (18,6,3,95); 

-------课程表
CREATE TABLE course(
course_id NUMBER PRIMARY KEY,
course_name VARCHAR2(30))
insert into course value(course_id,course_name) values (1,'语文')
insert into course value(course_id,course_name) values (2,'数学')
insert into course value(course_id,course_name) values (3,'英语')

在“英语”这科中,有2个学生的成绩都是95分而且都是这科排名第一的,所以当我要查询,每科目的第一名时
 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[color=red]dense_rank() [/color]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]rank()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]row_number()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

从结果中可以得知此时的dense_rank和rank()的结果是正确的,而row_number()只是显示其中的一条,至于为什么会选择那条希望有人帮我解答下。。。
而当我们要查询每科目的前3名时即改变rn<4,此时彼此之间的区别就很明显了
在此我们只比较英语这科的排名
dense_rank()会列出4列,其中有2个成绩95分的会并列第一,成绩94的排名第二
rank()会列出3列,其中有2个成绩95分的会并列第一,成绩94的排名第三
row_number()会列出3列,其中有2个成绩95分的从中选一个拍第一,另一个成绩也是95的则排名第二,成绩94的排名第三
  • 大小: 5 KB
  • 大小: 4.2 KB
  • 大小: 10.7 KB
  • 大小: 9.9 KB
  • 大小: 9.7 KB
分享到:
评论

相关推荐

    oracle分组排序统计高级用法

    #### 一、Oracle分组排序和统计概述 在Oracle数据库中,实现分组排序和统计是一项常见的需求,主要用于处理大量的数据,并从中提取有价值的信息。通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等...

    Oracle中分组后拼接分组字符串[文].pdf

    Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接分组字符串是一种常见的操作,用于将分组后的多条记录的某字段进行拼接。下面我们来详细介绍如何实现这种操作。 首先,创建一个测试表 `test`,该表包含三...

    如何在水晶报表中分组排序记录源程序实例,C#.net源代码编写,

    在Crystal Reports中,分组和排序是数据呈现的关键步骤,特别是在C#.NET环境中,通过Visual Studio.NET进行开发时。这篇文章将深入探讨如何使用C#.NET编写源代码来实现这一功能。 首先,理解水晶报表(Crystal ...

    oracle 根据部门求和排序

    上面语句表示,根据col1分组,在分组内部根据col2排序,这里的“别名”的值就是每组内部排序后的序列号(组内连续的、唯一的),“[partition by col1] ”可以省略。

    oracle索引序列查询分组排序连接视图等PPT教案.pptx

    oracle索引序列查询分组排序连接视图等PPT教案.pptx

    MySQL分组排序功能

    例如,在进行复杂的分组排序时,MySQL并没有提供类似于Oracle中的`OVER()`窗口函数,这使得实现某些复杂的数据分析变得较为棘手。本文将详细介绍如何在MySQL中实现类似Oracle中`row_number() over (partition by)`的...

    oracle处理的类型 oracle行排序

    例如,使用分析函数(如RANK(), DENSE_RANK(), ROW_NUMBER()等)可以实现分组排序,这对处理大数据量的报表或排名场景非常有用。另外,了解并合理运用Oracle的并行查询(Parallel Query)功能,可以在多处理器系统上...

    Oracle数据库分组查询练习题(包答案)

    根据提供的信息,我们可以详细解析与Oracle数据库分组查询相关的知识点,并通过具体的练习题目来加深理解。下面将逐一分析每一个题目中的关键知识点。 ### Oracle数据库分组查询知识点详解 #### 1. 查询部门20的...

    利用ORACLE实现数据的抽样

    在Oracle中,可以先通过`GROUP BY`对数据进行分组,再从每个分组中随机选取记录,以此来模拟整群抽样的效果。 #### 4. 分层抽样 分层抽样是将总体按照某些特征划分成不同的层,然后从每一层中随机抽取样本。在...

    oracle sqlldr;;merge;分组排序;条件赋值;表连接。简单示例

    实用基础SQL语句;oracle sqlldr;SQL基础语句;merge;分组排序;条件赋值;表连接。简单示例,Oracle数据库文档数据导入

    分组排序选择需要一条

    sql 排序:row_number() over(partition by sjjl_id order by fksj desc,最优化的情况,里面放的有例子,大家可以参考

    Toad for Oracle 12.8简体中文语言包

    3. 数据浏览和编辑:直观地查看和编辑数据库中的表、视图、索引等对象,支持数据过滤、排序和分组。 4. 性能分析:通过执行计划分析、SQL监控和性能调优顾问,帮助识别和解决性能瓶颈。 5. 自动化任务:通过工作流和...

    Oracle实现对查询结果每N条再次分组博客所用数据库

    标题中的“Oracle实现对查询结果每N条再次分组”是指在Oracle数据库中进行数据处理时,使用SQL语句对查询结果进行分组,而这里的“每N条再次分组”通常指的是使用GROUP BY子句配合ROW_NUMBER()、PARTITION BY等函数...

    Oracle左连接返回多条记录中一条记录的查询语句

    Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录

    Oracle中的分析函数详解

    分析函数(Analytic Functions)是Oracle SQL中的高级特性,它们在数据集上执行计算,并返回基于分组或排序的数据结果。与聚合函数(如SUM, AVG, COUNT等)不同,分析函数可以在每个行级别上返回结果,而不只是返回...

    Oracle中分组查询group by用法规则详解

    在Oracle数据库中,`GROUP BY`子句是一个关键的SQL元素,它允许用户根据一个或多个列的值将数据分组,以便对每个组进行聚合计算。以下是对`GROUP BY`用法的详细解释和规则: 1. **基本用法**: `GROUP BY`子句通常...

    Oracle多行记录合并

    在Oracle数据库中,多行记录的合并通常是为了将相同字段的多行数据整合成一行,以便于数据分析或者简化展示。这种操作在报表制作、数据整理等场景中非常常见。本篇文章将详细介绍Oracle中实现多行记录合并的几种方法...

    数据库面试题5 oracle笔试 oracle例题

    适当的索引可以加速分组和排序过程。 8. **索引选择性**: - 索引的选择性越高(即索引中的不同值越多),索引的效果越好。低选择性的索引(如性别列,只有两个可能值)可能不如高选择性索引(如身份证号)有效。 ...

Global site tag (gtag.js) - Google Analytics