Mysql,按百分比排名用户

时间:2016-03-19 11:40:46

标签: mysql database

我有一张这样的表,可以为学生保留历史考试的总分。

+----+---------------+-------+---------+-
| id | name          | history |  rank  | 
+----+---------------+-------+---------+-
|  1 | yngiid        |    97   |        | 
|  2 | viyrp         |   217   |        | 
|  3 | pae           |   599   |        | 
|  4 | spohl         |   284   |        | 
|  5 | shl           |   295   |        | 
|  6 | okeer         |    73   |        | 
|  7 | jmaany        |   657   |        | 
|  8 | hxt           |    80   |        | 
|  9 | yanier        |   599   |        | 
+----+---------------+-------+----------+-

您可以看到的历史记录字段包含学生的总分。现在,我想按照他们的分数对学生进行排名,分数越高,排名越低,但只使用百分比。这意味着,用户的排名只能从1到100,基本上类似于stackoverflow在个人资料页面上的位置,其中显示了.. top 1%

我试过这样的事情。

SELECT NAME, HISTORY, ROUND(history / 100) AS percentage FROM test ORDER BY percentage DESC

我只能得到这个。

name    HISTORY  percentage  
------  -------  ------------
jmaany      657             7
yanier      599             6
pae         599             6
shl         295             3
spohl       284             3
viyrp       217             2
yngiid       97             1
yngiid       97             1
okeer        73             1
yngiid       97             1
hxt          80             1
yngiid       97             1

以上是错误的,因为(1)百分比应该是1 - 100%,具有最高HISTORY点的用户应该获得最低百分比,以便说TOP 1%或类似的东西。

如果有帮助,这是一个示例表转储。

create table `test` (
    `id` int (11),
    `name` varchar (765),
    `history` int (11),
    `rank` int (11)
); 

insert into `test` (`id`, `name`, `history`, `rank`) values
('1','yngiid','97',NULL),
('2','viyrp','217',NULL),
('3','pae','599',NULL),
('4','spohl','284',NULL),
('5','shl','295',NULL),
('6','okeer','73',NULL),
('7','jmaany','657',NULL),
('8','hxt','80',NULL),
('9','yanier','599',NULL);

1 个答案:

答案 0 :(得分:1)

  

基本上类似于stackoverflow在个人资料页面上的内容,其中显示.. top 1%

逻辑堆栈溢出显示其顶部1%等等。退出易于编写。实际上,这意味着用户在所有用户中排名1% 。首先,对于每个用户,我们必须确定评级(history)大于或等于的用户数。然后应用简单的公式numberOfUsersHavingGreaterOrEqualRating / numberofTotalUsers * 100

SET @total= (SELECT COUNT(*) FROM stud);
select s1.*, concat('TOP ', floor(nge / @total * 100), '%') as percent 
from stud s1
join (select s1.id, count(s2.id) as nge
    from stud s1
    join stud s2
    on s1.history <= s2.history
    group by s1.id) as s2
on s1.id = s2.id
order by history desc

Play with it