我有一张这样的表,可以为学生保留历史考试的总分。
+----+---------------+-------+---------+-
| 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);
答案 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