Oracle或者PostgreSQL的row_number over 排名语法

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

这次我提供的表结构如下,
[sql]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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)  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值