java - 如何根据一些规则按降序创建优点列表?

标签 java sql algorithm oracle10g comparator

我正在做一个为大学创建录取系统的项目。这些技术是 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 过程和函数处理订购和比较全部数据(所有五个分支大约 50,000 个数据)。

最佳答案

这只是您需要的 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 等)位置并列,则不会返回结果。

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

关于java - 如何根据一些规则按降序创建优点列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11074231/

相关文章:

c# - System.Data.SQLite 不支持多事务

sql - SQL 查询中的低效 if/then 循环

java - 不同语言的相同算法的不同输出

algorithm - 在不相交的顶点之间生成随机边

java - 将数组插入 hashmap 而不创建新数组

java - Jersey 将空值序列化为 json : How to skip

java - 使用 KeyBindings Java 停止暂停键保持

java - Java中codingBat的twoTwo谜语解答

mysql - 从 MySQL 获取类似查询

java - 如何返回 BoundingVolume 中的所有点