2012-06-17 4 views
1

저는 대학 입학 허가 시스템을 만드는 프로젝트를 진행하고 있습니다. 기술은 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 배가됩니다.

오라클 프로 시저 및 함수를 사용하여 데이터를 정렬하고 비교하는 방법 (5 개 지점 모두 50,000 개)을 처리하는 방법에 난 혼란 스럽습니다.

답변

1

이것은 필요한 SQL 쿼리 일 뿐이므로 응답을 얻으려면 절차 코드 (예 : 함수, 프로 시저 또는 자바)가 필요하지 않을 것입니다.

예를 들어, {appl_no, subject_marks, total_marks}가있는 응용 프로그램 집합이 있으면 total_marks가 내림차순으로 정렬 할 수 있으며 일부 행의 total_marks가 동일한 경우 subject_marks의 내림차순으로 정렬 할 수 있습니다. :

SELECT * 
FROM (
    SELECT * 
    FROM application_details 
    ORDER BY total_marks DESC, subject_marks DESC 
) 
WHERE ROWNUM <= 30; 

(이것은 또한 ROW_NUMBER 분석 함수를 사용하여 수행 할 수 있습니다 :

SELECT * 
FROM application_details 
ORDER BY total_marks DESC, subject_marks DESC; 

당신이 30 석을 얻는 사람보고 싶은 경우에, 당신은 예를 들면, 처음 30 개 결과에 결과를 제한 할 수 있습니다 .)

그러나 이것은 30 석을 보유하고 있고 30 석을 2 명 이상이 묶어두면 그 중 하나를 효과적으로 무작위로 선택하고 다른 사람은 패배한다는 점에서 알고리즘의 불공정성을 다루지 않습니다 아웃.

대안은 최대 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 일 등) 장소, 결과를 반환하지 않습니다.

사용하는 규칙은 준수해야하는 규칙에 따라 다릅니다.

0

하나의 접근법은 동등한 인터페이스를 구현하는 엔티티에 테이블을 매핑하기 위해 hibernate와 같은 ORM 도구를 사용하여 주로 자바 언어를 사용합니다. 그런 다음 응용 프로그램을 정렬하고 결과를 같은 테이블의 다른 열 또는 테이블에 외래 키가있는 새 테이블로 저장할 수 있습니다.

물론 pl/sql 프로 시저를 사용할 수도 있지만, 런타임 성능이 더 좋을지라도 유지 관리가 훨씬 어렵습니다.

관련 문제