使用row_number() over(partition by)函式
row_number()over()、rank()over()和dense_rank()over()函式的使用下面以班級成績表t2來說明其應用
t2表資訊如下:
cfe 2 74
dss 1 95
ffd 1 95
fda 1 80
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
select * from
( select name,class,s,rank()over(partition by class order by s desc) mm from t2
) where mm=1;
得到的結果是:
dss 1 95 1
ffd 1 95 1
gds 2 92 1
gf 3 99 1
ddd 3 99 1
注意:
1.在求第一名成績的時候,不能用row_number(),因為如果同班有兩個並列第一,row_number()只返回乙個結果;
select * from
( select name,class,s,row_number()over(partition by class order by s desc) mm from t2
) where mm=1;
1 95 1 –95有兩名但是只顯示乙個
2 92 1
3 99 1 –99有兩名但也只顯示乙個
2.rank()和dense_rank()可以將所有的都查詢出來:
如上可以看到採用rank可以將並列第一名的都查詢出來;
rank()和dense_rank()區別:
–rank()是跳躍排序,有兩個第二名時接下來就是第四名;
select name,class,s,rank()over(partition by class order by s desc) mm from t2
dss 1 95 1
ffd 1 95 1
fda 1 80 3 –直接就跳到了第三
gds 2 92 1
cfe 2 74 2
gf 3 99 1
ddd 3 99 1
3dd 3 78 3
asdf 3 55 4
adf 3 45 5
–dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
dss 1 95 1
ffd 1 95 1
fda 1 80 2 –連續排序(仍為2)
gds 2 92 1
cfe 2 74 2
gf 3 99 1
ddd 3 99 1
3dd 3 78 2
asdf 3 55 3
adf 3 45 4
–sum()over()的使用
select name,class,s, sum(s)over(partition by class order by s desc) mm from t2 –根據班級進行分數求和
dss 1 95 190 –由於兩個95都是第一名,所以累加時是兩個第一名的相加
ffd 1 95 190
fda 1 80 270 –第一名加上第二名的
gds 2 92 92
cfe 2 74 166
gf 3 99 198
ddd 3 99 198
3dd 3 78 276
asdf 3 55 331
adf 3 45 376
詳細請參照連線:
Oracle乙個使用者查詢另乙個使用者的表資料
1 兩個使用者是在不同的庫,需要建立dblink 2 屬於同乙個庫的不同使用者 1 方法一 使用 使用者名稱.的方式訪問 例如 要從user1賬號訪問user2中的表table2 a.需要在user2中將table2 grant給user1,user1才有許可權訪問,訪問的時候用select fro...
寫給每乙個自己
寫給每乙個自己 韓寒 最近三個月,看世間百態,人情冷暖,失落與收穫都頗多。失落在我出生是純正的上海郊區農村屌絲,無權無勢,白手起家,本以為自己是乙個很勵志的 屌絲的逆襲 的故事,卻硬要被說成乙個經過多方神秘勢力包裝的驚天大陰謀 失落在北京有乙個幾面之交的 名流友人 莫名編造了乙個內幕,四處傳播,讓我...
Oracle賦予使用者查詢另乙個使用者所有表的許可權
使用者 usera,userb 場景 使用者usera只有使用者userb指定表的查詢許可權。解決方案 1.給他一些許可權,包括連線許可權,因為他要建立同義詞,還需要給他同義詞 grant connect to usera grant create synonym to usera grant cr...