這次我提供的表結構如下,
- Table "ytt.t1"
- Column | Type | Modifiers
- --------+-----------------------+-----------
- i_name | character varying(10) | not null
- rank | integer | not null
我模擬了20條數據來做演示。
- t_girl=# select * from t1 order by i_name;
- i_name | rank
- ---------+------
- Charlie | 12
- Charlie | 12
- Charlie | 13
- Charlie | 10
- Charlie | 11
- Lily | 6
- Lily | 7
- Lily | 7
- Lily | 6
- Lily | 5
- Lily | 7
- Lily | 4
- Lucy | 1
- Lucy | 2
- Lucy | 2
- Ytt | 14
- Ytt | 15
- Ytt | 14
- Ytt | 14
- Ytt | 15
- (20 rows)
在PostgreSQL下,我們來對這樣的排名函數進行三種不同的執行方式1:
第一種,完整的帶有排名字段以及排序。
- t_girl=# select i_name,rank, row_number() over(partition by i_name order by rank desc) as rank_number from t1;
- i_name | rank | rank_number
- ---------+------+-------------
- Charlie | 13 | 1
- Charlie | 12 | 2
- Charlie | 12 | 3
- Charlie | 11 | 4
- Charlie | 10 | 5
- Lily | 7 | 1
- Lily | 7 | 2
- Lily | 7 | 3
- Lily | 6 | 4
- Lily | 6 | 5
- Lily | 5 | 6
- Lily | 4 | 7
- Lucy | 2 | 1
- Lucy | 2 | 2
- Lucy | 1 | 3
- Ytt | 15 | 1
- Ytt | 15 | 2
- Ytt | 14 | 3
- Ytt | 14 | 4
- Ytt | 14 | 5
- (20 rows)
第二種,帶有完整的排名字段但是沒有排序。
- t_girl=# select i_name,rank, row_number() over(partition by i_name ) as rank_number from t1;
- i_name | rank | rank_number
- ---------+------+-------------
- Charlie | 12 | 1
- Charlie | 12 | 2
- Charlie | 13 | 3
- Charlie | 10 | 4
- Charlie | 11 | 5
- Lily | 6 | 1
- Lily | 7 | 2
- Lily | 7 | 3
- Lily | 6 | 4
- Lily | 5 | 5
- Lily | 7 | 6
- Lily | 4 | 7
- Lucy | 1 | 1
- Lucy | 2 | 2
- Lucy | 2 | 3
- Ytt | 14 | 1
- Ytt | 15 | 2
- Ytt | 14 | 3
- Ytt | 14 | 4
- Ytt | 15 | 5
- (20 rows)
第三種, 沒有任何排名字段,也沒有任何排序字段。
- t_girl=# select i_name,rank, row_number() over() as rank_number from t1;
- i_name | rank | rank_number
- ---------+------+-------------
- Lily | 7 | 1
- Lucy | 2 | 2
- Ytt | 14 | 3
- Ytt | 14 | 4
- Charlie | 12 | 5
- Charlie | 13 | 6
- Lily | 7 | 7
- Lily | 4 | 8
- Ytt | 14 | 9
- Lily | 6 | 10
- Lucy | 1 | 11
- Lily | 7 | 12
- Ytt | 15 | 13
- Lily | 6 | 14
- Charlie | 11 | 15
- Charlie | 12 | 16
- Lucy | 2 | 17
- Charlie | 10 | 18
- Lily | 5 | 19
- Ytt | 15 | 20
- (20 rows)