백분위 쿼리 작성하기 0 4 4,555

by stevekim [SQL Query] 쿼리 통계 오라클 [2024.01.23 10:17:10]


안녕하세요. 고수님들의 한 수 가르침을 받고자 합니다.

학생들의 성적 백분위를 산출하려는데 기존에는 탑다운으로 몇단계 걸쳐서 최종적으로 백분위를 산출하였는데 이를 개선해 보고자 글을 올렸습니다.

학생들의 백분위 공식은 다음과 같습니다.
(자기보다 점수가 낮은 학생의 숫자 + (자기와 동점자의 학생의 숫자 / 2) ) / 전체 학생의 숫자 * 100

Procedure로 짜면 단순히 짜면 되기는 한데 함수로 백분위값을 받고 싶어서요.

학생성적 테이블에 "학번","년도","학기","과목","점수" 컬럼이 있습니다.

by 마농 [2024.01.23 10:37:00]

1. 학생의 최종 점수 집계 기준이 어떻게 되나요?
- 연도별인지? 학기별인지? 과목별인지? 전체 다 인지?
2. 자기와 동점자의 학생의 숫자에
- 본인 포함 숫자인지? 본인 제외 숫자인지?


by stevekim [2024.01.23 12:37:30]

죄송합니다. 정보제공이 부실했네요.

1) 최종점수집계기준은 년도,학기,과목 입니다. (이범위내에서 백분위를 산출)
2) 본인 제외 숫자입니다.

부탁드립니다. 마농님^^


by 마농 [2024.01.23 13:22:08]
WITH 학생성적 AS
(
SELECT 1 학번, 2023 년도, 2 학기, 1 과목, 100 점수 FROM dual
UNION ALL SELECT 2, 2023, 2, 1, 90 FROM dual
UNION ALL SELECT 3, 2023, 2, 1, 80 FROM dual
UNION ALL SELECT 4, 2023, 2, 1, 80 FROM dual
UNION ALL SELECT 5, 2023, 2, 1, 80 FROM dual
UNION ALL SELECT 6, 2023, 2, 1, 70 FROM dual
UNION ALL SELECT 7, 2023, 2, 1, 60 FROM dual
UNION ALL SELECT 8, 2023, 2, 1, 60 FROM dual
UNION ALL SELECT 9, 2023, 2, 1, 50 FROM dual
UNION ALL SELECT 1, 2023, 2, 2, 90 FROM dual
UNION ALL SELECT 2, 2023, 2, 2, 80 FROM dual
UNION ALL SELECT 3, 2023, 2, 2, 70 FROM dual
UNION ALL SELECT 4, 2023, 2, 2, 60 FROM dual
)
SELECT 년도
     , 학기
     , 과목
     , 학번
     , 점수
     , ROUND(
       (   RANK()   OVER(PARTITION BY 년도, 학기, 과목 ORDER BY 점수 DESC) - 1
       + ( COUNT(*) OVER(PARTITION BY 년도, 학기, 과목, 점수) - 1) / 2
       ) / COUNT(*) OVER(PARTITION BY 년도, 학기, 과목)
         * 100, 2) AS 백분위
  FROM 학생성적
;

 


by stevekim [2024.01.23 15:41:45]

너무 너무 감사합니다. 제가 테스트 하고 적용토록 하겠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입