순위를 구하는 쿼리에 대해서 질문 드립니다.~~ 0 9 2,352

by phil [2013.07.28 17:00:40]


SELECT S1.학번,S1.과목코드,S1.점수
, (SELECT COUNT(*)+1 FROM 성적 S2 WHERE S2.점수 > S1.점수) AS 등수
FROM 성적 S1

위와 같은 쿼리로 등수를 매길때 , 만약 성적 정보가 5명이 있는데 , 그 중 3명이 동점자라면

동점자에 대해서 같은 등수가 나오는데요.

동점자에 대해서도 등수를 따로 매길려면 어떻게 해야 하는지 궁금합니다.

1 , 2 , 3 , 3 , 3 <== 이렇게 등수가 나오는데요.

이걸 3명의 점수가 같아도 , 1 , 2 , 3 , 4 , 5 이렇게 등수를 매기게 하고 싶습니다.

분석함수(row_number() 등등..)를 사용하지 않고 , 쿼리?!로 등수를 매겼으면 하는데요.

고수분들의 조언을 부탁드립니다.

감사합니다.~~
by 손님 [2013.07.28 17:30:32]

분석함수를 사용하면 깔끔한데...
굳이 그렇게 하시겠다면..?

먼저 동점자에 대한 기준이 뭔가요..?
그게 있어야 진행이 될꺼 같은데요..?

예) 동점자일 경우 학번순으로 등수를 부여하겠다 라는 기준 필요.

근데 정말 왜 저렇게 하려고 하시는지..? 이유가 궁금하네요...
만일 제 밑에 놈이 저렇게 짜면 전 화낼꺼 같은데요..?

굳이 중복테이블을 액세스하면서 하려는 이유가 있으신지요..? 메인쿼리의 결과값 만큼 스칼라서브쿼리가 수행될텐데... 단순 호기심차원이 아니라면...;;; 궁금..?


by 야신 [2013.07.31 00:26:35]
익명이 보기는 안 좋네요.

by 손님 [2013.07.28 18:33:17]
분석함수 기능을 지원하는 디비가 아니어서요.분석함수를 지원하는 디비면 괜찮은데요.어렵네요.ㅎㅎ

by 손님 [2013.07.28 18:37:41]
그러니까 제의도는 사용하는 디비가 분석함수 기능을 지원하지 않아서 쿼리로 분석함수를 어떻게 구현할수있는 방법이 없을까 고민해본거랍니다

by 손님 [2013.07.28 18:38:55]
한사람의 부족한 지식에 따른 고민을 제 밑에 놈으로 표현하신건 매너가 아닌것 같습니다

by 손님 [2013.07.28 18:40:04]
마농님같은 고수분도 그렇게 답변하신적 본적이 없습니다만..마농님보다 고수신가 보네요..

by 아린 [2013.07.28 20:17:46]
같은 점수에 대해서는 학번으로 정렬했습니다.

sql 내용은 테이블을 한번 읽어서 ORDER BY 로 정렬기준을 정한다음. 
ROWNUM 으로 순위로 부여했습니다. 
(같은 점수여도 순위는 다르게 나와요)

WITH t(학번, 점수) AS(  
SELECT '001', 85 FROM dual UNION ALL
SELECT '002', 95 FROM dual UNION ALL
SELECT '003', 90 FROM dual UNION ALL
SELECT '004', 90 FROM dual
)
SELECT ROWNUM ranks, 학번, 점수 
  FROM (SELECT *
          FROM t
         ORDER BY 점수 DESC, 학번 
        )  

by 용근님 [2013.07.29 01:03:28]
Mysql 이라면 변수를 사용한 numbering으로 해결하세요

by 마농 [2013.07.29 08:26:31]
-- 1. 유일키 항목을 추가 조건으로 주는 방법 --
-- 1.1. 스칼라서브쿼리
SELECT S1.학번, S1.과목코드, S1.점수
     , (SELECT COUNT(*) + 1
          FROM 성적 S2
         WHERE (S2.점수 > S1.점수)
            OR (S2.점수 = S1.점수 AND S2.학번 < S1.학번)
        ) AS 등수
  FROM 성적 S1
;
-- 1.2. Outer Join & Group by Count
SELECT S1.학번, S1.과목코드, S1.점수
     , COUNT(S2.학번) + 1 AS 등수
  FROM 성적 S1
  LEFT OUTER JOIN 성적 S2
    ON (S2.점수 > S1.점수)
    OR (S2.점수 = S1.점수 AND S2.학번 < S1.학번)
 GROUP BY S1.학번, S1.과목코드, S1.점수
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입