[MYSQL]Rank() over()的用法
from : https://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html
建立一個test表,並插入6條資料。
CREATE TABLE test ( a INT, b INT, c CHAR ) INSERT INTO test VALUES(1,3,'E') INSERT INTO test VALUES(2,4,'A') INSERT INTO test VALUES(3,2,'D') INSERT INTO test VALUES(3,5,'B') INSERT INTO test VALUES(4,2,'C')INSERT INTO test VALUES(2,4,'B')
SELECT * from test
a b c
----------- ----------- ----
1 3 E
2 4 A
3 2 D
3 5 B
4 2 C
2 4 B
(6 行受影響)
1、整個結果集是一個分組,以a進行排名
SELECT a,b,c,rank () OVER (ORDER BY a) rank FROM test
a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 2
2 4 B 2
3 2 D 4
3 5 B 4
4 2 C 6
(6 行受影響)
2、整個結果集是一個分組,以b進行排名
SELECT a,b,c,rank () OVER (ORDER BY b) rank FROM test
a b c rank
----------- ----------- ---- --------------------
3 2 D 1
4 2 C 1
1 3 E 3
2 4 A 4
2 4 B 4
3 5 B 6
(6 行受影響)
3、以a,b進行分組,在每個組內以b進行排名。分了5個組,第2行跟第3行是一個組,其他的每行是一個組。在第2行與第3行的組內以b排名,並列為1
SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY b) rank FROM test
a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 1
2 4 B 1
3 2 D 1
3 5 B 1
4 2 C 1
(6 行受影響)
4、以a,b進行分組,在每個組內以c進行排名。分了5個組,第2行跟第3行是一個組,其他的每行是一個組。在第2行與第3行的組內以c排名,由於c列一個是A,一個是B,所以Rank分別為1、2。
SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY c) rank FROM test
a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 1
2 4 B 2
3 2 D 1
3 5 B 1
4 2 C 1
(6 行受影響)
總結:1、partition by用於給結果集分組,如果沒有指定那麼它把整個結果集作為一個分組。
2、Rank 是在每個分組內部進行排名的。