注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

拥有自己的梦想,跟随心的召唤

平凡是福

 
 
 

日志

 
 

直接使用 SQL 执行分数排名处理  

2013-03-14 14:29:46|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
对分数数据"10,11,11,13,14,14,14,15"进行排名处理有两种结果:
1) 相同排名的数目影响下一排名的开始值,如有两个排名第2,则下一排名从4开始,没有排名3
10 - 1,11 - 2,11 - 2,13 - 4,14 - 5,14 - 5,14 - 5,15 - 8
2) 相同排名的数目不影响下一排名的开始值,如有两个排名第2,下一排名依然从3开始
10 - 1,11 - 2,11 - 2,13 - 3,14 - 4,14 - 4,14 - 4,15 - 5
这个方法的结果与Excel的Rank函数计算结果一致
SQL参考:
-- PostgreSQL
DROP TABLE RANK;

-- 建表
CREATE TABLE RANK(
  ID INT NOT NULL,
  NAME VARCHAR(255) NOT NULL,
  SCORE INT NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IDX_SCORE ON RANK(SCORE);

-- 测试数据
INSERT INTO RANK VALUES (1,'姓名1',15);
INSERT INTO RANK VALUES (2,'姓名2',11);
INSERT INTO RANK VALUES (3,'姓名3',11);
INSERT INTO RANK VALUES (4,'姓名4',13);
INSERT INTO RANK VALUES (5,'姓名5',14);
INSERT INTO RANK VALUES (6,'姓名6',14);
INSERT INTO RANK VALUES (7,'姓名7',14);
INSERT INTO RANK VALUES (8,'姓名8',10);

-- 方法1: 1-2(2)-4-5(3)-8
SELECT d.NAME AS 姓名, d.SCORE AS 成绩, e.place AS 排名
  FROM (
    select a.id,count(b.id)+1 as place 
      from RANK a 
      left join RANK b on a.SCORE > b.SCORE 
      group by a.id
  ) e 
  INNER JOIN RANK AS d ON e.id = d.id
  order by e.place;

-- 方法2: 1-2(2)-3-4(3)-5
SELECT d.NAME AS 姓名, d.SCORE AS 成绩, e.place AS 名次
  FROM (
    select c.id,count(c.SCORE)+1 as place 
      from (select a.id,b.SCORE from RANK a left join RANK b on a.SCORE > b.SCORE group by a.id,b.SCORE) c 
      group by c.id
  ) e 
  INNER JOIN RANK AS d ON e.id = d.id
  order by e.place;
  
-- 方法3: 1-2(2)-3-4(3)-5 (利用行号,注意不同数据库要使用不同的行号获取方法)
select a.NAME 姓名, b.SCORE 成绩, b.rownum 排名
  from RANK a
  left join (select row_number() over() as rownum,SCORE from RANK group by SCORE order by SCORE asc) b on b.SCORE = a.SCORE
  order by b.rownum asc;

参考:
  评论这张
 
阅读(529)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017