我正在做一个为学院创建录取系统的项目。这些技术是Java和Oracle。
学院在全国各地设有5个分校。学院邀请候选人分组提交申请表,但所有与候选人相关的数据都存储起来,并在位于德里的总部进行集中处理。有SC,ST,OBC,PH候选人等保留40%的席位,中央总部负责创建一个分支方式,部门方面,按类别划分的优点列表顺序按总分数(为简单起见)下降为了填补席位(每个部门说30个席位)。现在,如果两个候选人获得相同的标记,那么候选人在申请的主题中获得更高的分数将是优选的。现在为简单起见,假设所有必需的数据都存储在一个平面表中,例如application_details {appl_no,form_no,branch,department,name,gender,dob,category,subject_marks,total_marks}。
此外,将有一个等待名单,这将是座位数的2倍。
我很困惑,关于如何使用Oracle过程和函数来处理订购和比较所有数据(所有五个分支的5万个)。
答案 0 :(得分:1)
这只是您需要的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个(或实际上是第29个或第28个等)的位置存在平局,则不会返回结果。
您使用哪一个取决于您需要遵守的规则。
答案 1 :(得分:0)
一种方法主要使用java语言,使用像hibernate这样的ORM工具将表映射到实现类似接口的实体。然后,您可以对应用程序进行排序,并将结果保存到同一个表的另一列或具有表的外键的新表中。
当然你可以使用pl / sql程序,但这将是一个难以维护的代码,即使它有更好的运行时性能。