PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便。 MySQL却没有提供这样的语法。
这次我提供的表结构如下,
我模拟了20条数据来做演示。
在PostgreSQL下,我们来对这样的排名函数进行三种不同的执行方式1:
第一种,完整的带有排名字段以及排序。
第二种,带有完整的排名字段但是没有排序。
第三种, 没有任何排名字段,也没有任何排序字段。
这次我提供的表结构如下,
- 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)