Oracle或者PostgreSQL的row_number over 排名语法

PostgreSQL 和Oracle 都提供了 row_number() over() 这样的语句来进行对应的字段排名, 很是方便。  MySQL却没有提供这样的语法。 

这次我提供的表结构如下,
[sql]  view plain copy
  1.                Table "ytt.t1"  
  2.  Column |         Type          | Modifiers   
  3. --------+-----------------------+-----------  
  4.  i_name | character varying(10) | not null  
  5.  rank   | integer               | not null  

我模拟了20条数据来做演示。
[sql]  view plain copy
  1. t_girl=# select * from t1 order by i_name;                               
  2.  i_name  | rank   
  3. ---------+------  
  4.  Charlie |   12  
  5.  Charlie |   12  
  6.  Charlie |   13  
  7.  Charlie |   10  
  8.  Charlie |   11  
  9.  Lily       |    6  
  10.  Lily       |    7  
  11.  Lily        |    7  
  12.  Lily       |    6  
  13.  Lily       |    5  
  14.  Lily    |    7  
  15.  Lily    |    4  
  16.  Lucy    |    1  
  17.  Lucy    |    2  
  18.  Lucy    |    2  
  19.  Ytt     |   14  
  20.  Ytt     |   15  
  21.  Ytt     |   14  
  22.  Ytt     |   14  
  23.  Ytt     |   15  
  24. (20 rows)  

在PostgreSQL下,我们来对这样的排名函数进行三种不同的执行方式1:
第一种,完整的带有排名字段以及排序。
[sql]  view plain copy
  1. t_girl=# select i_name,rank, row_number() over(partition by i_name order by rank descas rank_number from t1;     
  2.  i_name  | rank | rank_number   
  3. ---------+------+-------------  
  4.  Charlie     |   13 |           1  
  5.  Charlie    |   12 |           2  
  6.  Charlie    |   12 |           3  
  7.  Charlie    |   11 |           4  
  8.  Charlie    |   10 |           5  
  9.  Lily       |    7 |           1  
  10.  Lily       |    7 |           2  
  11.  Lily       |    7 |           3  
  12.  Lily       |    6 |           4  
  13.  Lily       |    6 |           5  
  14.  Lily       |    5 |           6  
  15.  Lily       |    4 |           7  
  16.  Lucy   |    2 |           1  
  17.  Lucy   |    2 |           2  
  18.  Lucy   |    1 |           3  
  19.  Ytt        |   15 |           1  
  20.  Ytt        |   15 |           2  
  21.  Ytt        |   14 |           3  
  22.  Ytt        |   14 |           4  
  23.  Ytt        |   14 |           5  
  24. (20 rows)  

第二种,带有完整的排名字段但是没有排序。

[sql]  view plain copy
  1. t_girl=# select i_name,rank, row_number() over(partition by i_name ) as rank_number from t1;  
  2.  i_name  | rank | rank_number   
  3. ---------+------+-------------  
  4.  Charlie     |   12 |           1  
  5.  Charlie    |   12 |           2  
  6.  Charlie    |   13 |           3  
  7.  Charlie    |   10 |           4  
  8.  Charlie    |   11 |           5  
  9.  Lily       |    6 |           1  
  10.  Lily       |    7 |           2  
  11.  Lily       |    7 |           3  
  12.  Lily       |    6 |           4  
  13.  Lily       |    5 |           5  
  14.  Lily       |    7 |           6  
  15.  Lily       |    4 |           7  
  16.  Lucy   |    1 |           1  
  17.  Lucy   |    2 |           2  
  18.  Lucy   |    2 |           3  
  19.  Ytt        |   14 |           1  
  20.  Ytt        |   15 |           2  
  21.  Ytt        |   14 |           3  
  22.  Ytt        |   14 |           4  
  23.  Ytt        |   15 |           5  
  24. (20 rows)  

第三种, 没有任何排名字段,也没有任何排序字段。

[sql]  view plain copy
  1. t_girl=# select i_name,rank, row_number() over() as rank_number from t1;  
  2.  i_name  | rank | rank_number   
  3. ---------+------+-------------  
  4.  Lily        |    7 |           1  
  5.  Lucy   |    2 |           2  
  6.  Ytt        |   14 |           3  
  7.  Ytt        |   14 |           4  
  8.  Charlie    |   12 |           5  
  9.  Charlie    |   13 |           6  
  10.  Lily       |    7 |           7  
  11.  Lily       |    4 |           8  
  12.  Ytt        |   14 |           9  
  13.  Lily       |    6 |          10  
  14.  Lucy   |    1 |          11  
  15.  Lily       |    7 |          12  
  16.  Ytt        |   15 |          13  
  17.  Lily       |    6 |          14  
  18.  Charlie    |   11 |          15  
  19.  Charlie    |   12 |          16  
  20.  Lucy   |    2 |          17  
  21.  Charlie    |   10 |          18  
  22.  Lily       |    5 |          19  
  23.  Ytt        |   15 |          20  
  24. (20 rows)  

你可能感兴趣的:(数据库,PostgreSQL)