1

私は、大学の入学システムを作成するプロジェクトを行っています。テクノロジーは Java と Oracle です。

カレッジには、全国に 5 つの支部があります。大学は、候補者からの申請書を支部ごとに招待しますが、候補者に関連するすべてのデータは、たとえばデリーにある本社から一元的に保存および処理されます。SC、ST、OBC、PH の候補者などには 40% の席が予約されており、本部本部は支店ごと、部門ごと、カテゴリごとのメリット リストを作成する責任があります。席を埋めるために注文します (各部門に 30 席とします)。2 人の受験者が同じ点数を確保した場合、申請する科目で高い点数を取得している受験者が優先されます。簡単にするために、すべての必要なデータは、application_details{appl_no、form_no、branch、department、name、gender、dob、category、subject_marks、

また、2倍の席数となるウェイティングリストもございます。

Oracle のプロシージャと関数を使用して、大量のデータ (5 つのブランチすべてで約 50,000) を並べ替えて比較する方法について、私は困惑しています。

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 議席に同点の場合、その中の 1 人を効果的に無作為に選び、もう 1 人が負けるということです。

別の方法は、最大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

1 つのアプローチは、主に Java 言語を使用し、hibernate などの ORM ツールを使用して、同等のインターフェイスを実装するエンティティにテーブルをマップすることです。次に、アプリケーションを並べ替えて、結果を同じテーブルの別の列、またはテーブルへの外部キーを持つ新しいテーブルに保存できます。

もちろん、pl/sql プロシージャを使用することもできますが、実行時のパフォーマンスが向上したとしても、コードの保守がはるかに困難になります。

于 2012-06-18T02:34:52.090 に答える