首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按照一定的规则降序创建功绩排行榜?

如何按照一定的规则降序创建功绩排行榜?
EN

Stack Overflow用户
提问于 2012-06-18 03:37:41
回答 2查看 1.5K关注 0票数 1

我正在做一个为一所大学创建录取系统的项目。这些技术是Java和Oracle。

该学院在全国有5个分校。学院以分部的方式邀请考生提交申请表,但所有与考生相关的数据都由他们位于德里的总公司集中存储和处理。有40%的席位预留给SC、ST、OBC、PH等候选人,中央总公司负责按照他们的总成绩(为简单起见)创建一个分支机构、部门和类别的成绩表(为了简单起见),以填补席位(每个部门30个席位)。现在,如果两名考生获得相同的分数,那么在申请的科目中获得较高分数的考生将被优先考虑。现在为了简单起见,假设所有需要的数据都存储在一个扁平表中,比如application_details{appl_no,form_no,branch,department,name,gender,道布,category,subject_marks,total_marks}。

此外,将有一个等待名单,这将是座位数量的2倍。

我对如何使用Oracle过程和函数处理整个数据的排序和比较(所有五个分支大约为50000)感到困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-18 10:53:47

这只是一个你需要的SQL查询,你可能不需要任何过程代码(例如函数、过程或java)来获得答案。

例如,给定一组带有{appl_no,subject_marks,total_marks}的应用程序,您可以按total_marks的降序对其进行排序,当某些行具有相同的total_marks时,您可以按subject_marks的降序对其进行排序,例如:

代码语言:javascript
复制
SELECT *
FROM   application_details
ORDER BY total_marks DESC, subject_marks DESC;

如果你想看看谁得到了30个席位,你可以将结果限制在前30个结果,例如:

代码语言:javascript
复制
SELECT *
FROM (
  SELECT *
  FROM   application_details
  ORDER BY total_marks DESC, subject_marks DESC
  )
WHERE ROWNUM <= 30;

(这也可以使用ROW_NUMBER分析函数来完成。)

然而,这并没有解决算法的不公平问题,因为如果你有30个座位,并且2个或更多人并列在第30个座位上,你将有效地随机选择其中一个,而另一个人将输掉比赛。

另一种选择是改变规则,最多分配30个席位;如果第30个席位有任何平局,则留出空缺。要做到这一点,你可以使用合适的分析从句,例如:

代码语言:javascript
复制
SELECT *
FROM   (
  SELECT DENSE_RANK()
         OVER (ORDER BY total_marks DESC,
                        subject_marks DESC) dr,
         ad.*
  FROM   application_details ad
  )
WHERE dr <= 30;

这将返回最多30个前30个结果,但如果并列在第30位(或者实际上是第29位、第28位等),则不会返回结果。

您使用哪一个将取决于您需要遵守的规则。

票数 1
EN

Stack Overflow用户

发布于 2012-06-18 10:34:52

一种方法是主要使用java语言,使用诸如hibernate之类的ORM工具将表映射到实现可比较接口的实体中。然后,您可以对应用程序进行排序,并将结果保存到同一个表的另一列中,或者保存到具有指向您的表的外键的新表中。

当然,您可以使用pl/sql过程,但这将是一个更难维护的代码,即使它具有更好的运行时性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11074231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档