关闭

oracle的 row_number() over()应用

标签: row_number over函数oracle
220人阅读 评论(0) 收藏 举报
分类:

最近在开发中遇到了一个问题,有一个课程表,和一个专业表,课程表和专业表示多对多的关系,即一个专业可能包含多个课程,一个课程也可能属于多个专业,如下图所示:KCH(课程号)--ZYH(专业号)


那么现在要求查出这张表中的所有不重复的课程号(kch),如果这个课程号(kch)对应多个专业号,那么就根据专业号排序,取第一条数据,

在这种情况下就需要用到row_number() over()这个分析函数,语法如下:

ROW_NUMBER() OVER(partition by col1 order by col2)

解释:意思是说将查询结果根据COL1分组然后根据COL2排序,然后将每个分组结果都会生成一个从1.....n 的序列号,注意是为每个分组生成而不是   为整个查询结果生成序列号。

………这道了这些就可以对以上的问题进行解决,根据课程号(kch)分组,然后根据专业号(zyh)进行排序sql语句如下:

select t1.*,row_number() over(partition by t1.kch ORDER BY zyh) cn from table1 t1

查询结果如下图所示:


可以看出,现在已经为每个分组都生成了从1.......N的一个序列号,那么现在为了最终解决问题,就可以用这个查询结果作为子查询来进一步达成我们的目的sql语句如下:

SELECT z1.kch,z1.zyh,z1.cn FROM (
select t1.*,row_number() over(partition by t1.kch ORDER BY zyh) cn from DZYKM_ALL t1) z1
WHERE z1.cn = 1

查询结果如下图:


这样就达成了开始我们的目的,个人觉得这个函数最好用的地方就是:1.可以根据某个字段进行分组而根据其他的字段进行排序,这个是group by……order by……所做不到的;2.可以为每个分组的n条数据生成一个从1......n排序号,可以用作筛选条件

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5249次
    • 积分:111
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:4篇
    • 译文:0篇
    • 评论:6条