我正在做一个为一所大学创建录取系统的项目。这些技术是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)感到困惑。
发布于 2012-06-18 10:53:47
这只是一个你需要的SQL查询,你可能不需要任何过程代码(例如函数、过程或java)来获得答案。
例如,给定一组带有{appl_no,subject_marks,total_marks}的应用程序,您可以按total_marks的降序对其进行排序,当某些行具有相同的total_marks时,您可以按subject_marks的降序对其进行排序,例如:
SELECT *
FROM application_details
ORDER BY total_marks DESC, subject_marks DESC;如果你想看看谁得到了30个席位,你可以将结果限制在前30个结果,例如:
SELECT *
FROM (
SELECT *
FROM application_details
ORDER BY total_marks DESC, subject_marks DESC
)
WHERE ROWNUM <= 30;(这也可以使用ROW_NUMBER分析函数来完成。)
然而,这并没有解决算法的不公平问题,因为如果你有30个座位,并且2个或更多人并列在第30个座位上,你将有效地随机选择其中一个,而另一个人将输掉比赛。
另一种选择是改变规则,最多分配30个席位;如果第30个席位有任何平局,则留出空缺。要做到这一点,你可以使用合适的分析从句,例如:
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位等),则不会返回结果。
您使用哪一个将取决于您需要遵守的规则。
发布于 2012-06-18 10:34:52
一种方法是主要使用java语言,使用诸如hibernate之类的ORM工具将表映射到实现可比较接口的实体中。然后,您可以对应用程序进行排序,并将结果保存到同一个表的另一列中,或者保存到具有指向您的表的外键的新表中。
当然,您可以使用pl/sql过程,但这将是一个更难维护的代码,即使它具有更好的运行时性能。
https://stackoverflow.com/questions/11074231
复制相似问题