Tidy up the sort:
To build a table statement:
CREATE TABLE EXAM
(
Name VARCHAR2 (32),
Subject VARCHAR2 (32),
Score INTEGER
)
Data:
INSERT into EXAM VALUES (' Zhao Liu ', ' math ', ' 71 ');
INSERT into EXAM VALUES (' Zhang San ', ' math ', ' 81 ');
INSERT into EXAM VALUES (' John Doe ', ' math ', ' 75 ');
INSERT into EXAM VALUES (' starting point ', ' math ', ' 88 ');
INSERT into EXAM VALUES (' Start ', ' English ', ' 98 ');
INSERT into EXAM VALUES (' John Doe ', ' English ', ' 86 ');
INSERT into EXAM VALUES (' Zhao Liu ', ' English ', ' 86 ');
INSERT into EXAM VALUES (' Zhang Sizhong's ', ' English ', ' 33 ');
INSERT into EXAM VALUES (' John Doe ', ' language ', ' 75 ');
INSERT into EXAM VALUES (' Zhang San ', ' language ', ' 81 ');
INSERT into EXAM VALUES (' Zhao Liu ', ' language ', ' 71 ');
INSERT into EXAM VALUES (' Start ', ' language ', ' 88 ');
1.row_number () over () Usage: SELECT *,row_number () over (PARTITION by ' grouping ' order by ' sort ') RN from TABLE;
SELECT T.name,t.subject,t.score, Row_number () over (PARTITION by T.subject ORDER by T.score DESC) rn from exam t;
2:rank () over () Skip sort
For Row_number () over (), if two values are equal, the distinction is not made before and after, as shown in:
is a jump sort, there can be two second, followed by the third place;
SELECT T.name,t.subject,t.score, Rank () over (PARTITION by T.subject ORDER by T.score DESC) rn from exam t;
3:Dense_rank () over ()
If you want two second names followed by third place: SELECT T.name,t.subject,t.score, Dense_rank () over (PARTITION by T.subject ORDER by T.score DESC) RN FRO M exam T;
Problems with grouping sort values in Oracle