邏輯很簡單,但是看下解析之後還是很明白的。 Q2。在oracle中有一資料表exam_result(成績記錄表),表中的一條記錄描述了“某個班某個學生某次考試的成績"create table EXAM_RESULT(ID NUMBER(10) not null, --主鍵 CLASSID NUMBER(10) not null, -- 班級id,關聯到班級表 USERID NUMBER(10) not null, --使用者id,關聯到使用者表 EXAMID NUMBER(10) not null, --試卷id,關聯到試卷表 RESULT NUMBER(3) --成績 select * from ( select e.classid, e.userid, e.examid, e.result, row_number() over (partition by e.examid order by e.examid, e.result desc) rn from exam_result e where e.examid in (1,2,3) ) where rn <= 3 row_number() over的函式是將按e.examid分組,再按e.examid降序排列。這兩個欄位當然可以不一樣。。這個函式與nownum的功能差不多,區別在於:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而此函式在包含排序從句後是先排序再計算行號碼. 另外幾下函式: rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內). dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重複值的 .lag(arg1,arg2,arg3): arg1是從其他行返回的表示式 arg2是希望檢索的當前行分割槽的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數目。 arg3是在arg2表示的數目超出了分組的範圍時返回的值。使用的方法與row_number() 是一樣的。(參考)
邏輯很簡單,但是看下解析之後還是很明白的。 Q2。在oracle中有一資料表exam_result(成績記錄表),表中的一條記錄描述了“某個班某個學生某次考試的成績"create table EXAM_RESULT(ID NUMBER(10) not null, --主鍵 CLASSID NUMBER(10) not null, -- 班級id,關聯到班級表 USERID NUMBER(10) not null, --使用者id,關聯到使用者表 EXAMID NUMBER(10) not null, --試卷id,關聯到試卷表 RESULT NUMBER(3) --成績 select * from ( select e.classid, e.userid, e.examid, e.result, row_number() over (partition by e.examid order by e.examid, e.result desc) rn from exam_result e where e.examid in (1,2,3) ) where rn <= 3 row_number() over的函式是將按e.examid分組,再按e.examid降序排列。這兩個欄位當然可以不一樣。。這個函式與nownum的功能差不多,區別在於:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而此函式在包含排序從句後是先排序再計算行號碼. 另外幾下函式: rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內). dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重複值的 .lag(arg1,arg2,arg3): arg1是從其他行返回的表示式 arg2是希望檢索的當前行分割槽的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數目。 arg3是在arg2表示的數目超出了分組的範圍時返回的值。使用的方法與row_number() 是一樣的。(參考)