需求場景:html
表結構及數據:sql
查詢效果:數據庫
思路:函數
sql語句:htm
查詢結果:blog
=========================感謝下面這些博主的博客=============================排序
轉自:http://www.cnblogs.com/zhangchengye/p/5473860.html#4017927get
partition by關鍵字是分析性函數的一部分,它和聚合函數(如group by)不一樣的地方在於它能返回一個分組中的多條記錄,而聚合函數通常只有一條反映統計值的記錄,博客
partition by用於給結果集分組,若是沒有指定那麼它把整個結果集做爲一個分組。數學
partition by 與group by不一樣之處在於前者返回的是分組裏的每一條數據,而且能夠對分組數據進行排序操做。後者只能返回聚合以後的組的數據統計值的記錄。
Demo
數據庫表結構 學生成績表 UserGrade
Id int Checked 主鍵Id
Name varchar(50) Checked 學生名
Course varchar(50) Checked 課程名
Score int Checked 分數
0一、把每一個人學生的成績按照升序排名 (思路:根據學生姓名分組 根據每一個人成績排序)
sql語句
select *,ROW_NUMBER() over( partition by Name order by Score )排名
from UserGrade
查詢結果
Id Name Course Score 排名
1004 李四 數學 60 1
1005 李四 語文 80 2
1001 李四 英語 100 3
1007 王五 數學 30 1
1006 王五 語文 50 2
1003 王五 英語 50 3
1008 張三 英語 60 1
1000 張三 語文 80 2
1002 張三 數學 90 3
0二、把每一個學科的成績分別進行排名 (思路:根據學科分組 根據成績排序)
sql語句
select *,ROW_NUMBER() over( partition by Course order by Score )排名
from UserGrade
查詢結果
Id Name Course Score 排名1002 張三 數學 90 11004 李四 數學 60 21007 王五 數學 30 31001 李四 英語 100 11008 張三 英語 60 21003 王五 英語 50 31000 張三 語文 80 11005 李四 語文 80 21006 王五 語文 50 3