排序:
---rank()over(order by 列名 排序)的結果是不連續的,如果有4個人,其中有3個是並列第1名,那么最后的排序結果結果如:1 1 1 4
select scoreid, studentid,COURSENAME,totalexamscore ,
rank()over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
---dense_rank()over(order by 列名 排序)的結果是連續的,如果有4個人,其中有3個是並列第1名, 那么最后的排序結果如:1 1 1 2
select scoreid, studentid,COURSENAME,totalexamscore ,
dense_rank()over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
----rank () OVER (PARTITION BY 列名 ORDER BY 列名 排序)使用分區方式獲取每門課程的最高分
SELECT *
FROM (SELECT scoreid, studentid, coursename, TOTALEXAMSCORE,
rank () OVER (PARTITION BY coursename ORDER BY TOTALEXAMSCORE DESC)orderbynum
FROM scorecourse a, coursescore b
WHERE a.scorecourseid = b.scorecourseid and studentID = 'xxxxx')
WHERE orderbynum < 2
-----使用over實現成績求和
-----SUM (totalexamscore) OVER (ORDER BY studentid) sum1 實現的是連續求和,如第一個學生的總評成績是30,則sum1就展示為30,到第二個學生成績出現的時候,則會依次累加
-----SUM (totalexamscore) OVER () sum2 就相當於是單純的求和,和直接使用sum是一致的
SELECT scoreid, studentid, totalexamscore,
SUM (totalexamscore) OVER (ORDER BY studentid) sum1,
SUM (totalexamscore) OVER () sum2
FROM coursescore
注:這個案例想了很久也沒想到很直觀的描述,還請大家親自去測試一下吧!!
語法:
rank() over (order by 排序字段 順序)
rank() over (partition by 分組字段 order by 排序字段 順序)
1.順序:asc|desc 名次與業務相關:
示例:求優秀學員,成績:降序 遲到次數:升序
2.分區字段:根據什么字段進行分區。
問題:分區與分組有什么區別?
•分區只是將原始數據進行名次排列(記錄數不變),
•分組是對原始數據進行聚合統計(記錄數變少,每組返回一條)。
注意:使用rank()over(order by 排序字段 順序)排序的時候,空值是最大的
(如果排序字段為null,可能造成在排序時將null字段排在最前面,影響排序的正確性。
所以建議將dense_rank()over(order by 列名 排序)改為dense_rank()over(order by 列名 排序 nulls last)
這樣只要排序字段為null,就會放在最后,而不會影響排序結果).
---------------------
作者:eleven204
來源:CSDN
原文:https://blog.csdn.net/eleven204/article/details/6616448?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!