1

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

学院在全国设有5个分校。学院邀请候选人提交申请表,但所有与候选人相关的数据都从位于德里的总部集中存储和处理。为 SC、ST、OBC、PH 候选人等预留了 40% 的席位,中央总部负责创建分公司、部门、类别的优秀名单,按总分(为简单起见)降序排列以填补席位(例如每个部门 30 个席位)。现在,如果两个候选人获得相同的分数,那么在申请的科目中获得更高分数的候选人将被优先考虑。现在为简单起见,假设所有需要的数据都存储在一个平面表中,比如 application_details{appl_no, form_no, branch, department, name, gender, dob, category, subject_marks,

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

我很困惑,关于如何使用 Oracle 过程和函数处理排序和比较全部数据(所有五个分支大约 5 万个)。

4

2 回答 2

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 位等)出现平局,则不会返回结果。

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

于 2012-06-18T02:53:47.190 回答
0

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

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

于 2012-06-18T02:34:52.090 回答