Oracle或者PostgreSQL的row_number over 排名語法

PostgreSQL 和Oracle 都提供了 row_number() over() 這樣的語句來進行對應的字段排名, 很是方便。  MySQL卻沒有提供這樣的語法。 

這次我提供的表結構如下,
  1.                Table "ytt.t1"  
  2.  Column |         Type          | Modifiers   
  3. --------+-----------------------+-----------  
  4.  i_name | character varying(10) | not null  
  5.  rank   | integer               | not null  

我模擬了20條數據來做演示。
  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:
第一種,完整的帶有排名字段以及排序。
  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)  

第二種,帶有完整的排名字段但是沒有排序。

  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)  

第三種, 沒有任何排名字段,也沒有任何排序字段。

  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)  
發佈了31 篇原創文章 · 獲贊 21 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章