database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 42001 게시물 읽기
No. 42001
조직별, 점수별 순위 지정 RANK 함수
작성자
IT재벌(IT재벌)
작성일
2024-12-10 16:50ⓒ
2024-12-10 16:56ⓜ
조회수
149

항상 많은 도움을 받고 있습니다.

저희 회사에서 조직별, 직원별 점수에 따라 순위를 적용하려고 하는데요.


아래와 같은 쿼리를 실행하였습니다.


with t as 

(

select    'A001'    as dept,    '0001'    as emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0001'    as emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0001'    as emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, 1.751 as score    from dual    

)

select dept, emp, score, rank() over (partition by dept order by score) as rank

from t

order by emp



최종적으로 아래와 같은 결과값을 원했는데, 순위가 생각한대로 적용이 되지 않네요

조직별로 score 를 기준하여 사원별 순위를 선정합니다.

score가 같은 경우 순위는 공동순위로 표시가 되고, 다음 score의 경우 차순위로 표시가 되길 원합니다.

--------------------------------------------------

dept    emp     score    rank

A001    0001    1.235    1

A001    0001    1.235    1

A001    0001    1.235    1

A001    0002    2.215    4

A001    0002    2.215    4

A001    0002    2.215    4

A001    0003    1.751    2

A001    0003    1.751    2

A001    0003    1.751    2

A001    0004    2.851    5

A001    0004    2.851    5

A001    0004    2.851    5

A001    0005    1.751    2

A001    0005    1.751    2

A001    0005    1.751    2

--------------------------------------------------



실제로 쿼리를 돌리면, 

dept    emp     score    rank

A001    0001    1.235    1

A001    0001    1.235    1

A001    0001    1.235    1

A001    0002    2.215    10

A001    0002    2.215    10

A001    0002    2.215    10

A001    0003    1.751    4

A001    0003    1.751    4

A001    0003    1.751    4

A001    0004    2.851    13

A001    0004    2.851    13

A001    0004    2.851    13

A001    0005    1.751    4

A001    0005    1.751    4

A001    0005    1.751    4


이런 형태로 조회가 됩니다.

하나의 조직이 3개의 row 를 가지고 있어서 그런 듯 한데 이 부분을 해결할 방법이 있을까요?

 

이 글에 대한 댓글이 총 5건 있습니다.

중복이 있는 상태에서 예외처리를 하는게 맞는 걸까요?

중복이 제거된 상태에서 정상처리를 하는게 맞지 않을까요?

지금 출력되는 자료만 보면 중복자료외에 다른 자료가 안보이네요.

중복이 안되는 다른 자료 출력이 필요하다면 모를까?

중복자료밖에 없는데 굳이 여러번 출력할 이유가 있는지?

마농(manon94)님이 2024-12-10 17:15에 작성한 댓글입니다.

중복문제가 발생되는 원인은 해당 데이터에서 칼럼 하나를 빼고 설명을 올렸는데요

다른 직원이 평가하는 형태입니다.


정확한 테이블 형태로 보자면 이렇게 됩니다.


with t as 

(

select    'A001'    as dept,    '0001'    as emp, '0002' as ra_emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0001'    as emp, '0003' as ra_emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0001'    as emp, '0004' as ra_emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0001'    as emp, '0005' as ra_emp, 1.235 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, '0001' as ra_emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, '0003' as ra_emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, '0004' as ra_emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0002'    as emp, '0005' as ra_emp, 2.215 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, '0001' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, '0002' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, '0004' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0003'    as emp, '0005' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, '0001' as ra_emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, '0002' as ra_emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, '0003' as ra_emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0004'    as emp, '0005' as ra_emp, 2.851 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, '0001' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, '0002' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, '0003' as ra_emp, 1.751 as score    from dual    union all

select    'A001'    as dept,    '0005'    as emp, '0004' as ra_emp, 1.751 as score    from dual    

)


select dept, emp, ra_emp, score, rank() over (partition by dept order by score) as rank

from t

order by emp, ra_emp

IT재벌(IT재벌)님이 2024-12-16 15:04에 작성한 댓글입니다.
이 댓글은 2024-12-16 15:09에 마지막으로 수정되었습니다.

데이터가 조금 의아한게.

서로를 평가하는 것 같은데?

한 사람에 대한 다른 직원의 평가점수가 동일할 수 있나요?

마농(manon94)님이 2024-12-17 08:53에 작성한 댓글입니다.

확인이 늦었습니다.


여기서 보여지는 score는 각 직원들이 평가를 한 평균값입니다.

항목이 몇 개 있어서 그 항목들을 점수로 평가하고, 그 평가한 평균값을 표현한 겁니다.


예제에서는 그 평가 점수들은 배제하고 평균값만 나타냈는데, 

제가 alias 를 score 로 표현해서 오히려 혼란을 더 나타낸 것 같네요

IT재벌(IT재벌)님이 2025-01-16 18:42에 작성한 댓글입니다.
질문시 원본 대비 최종 결과로 질문하시는게 좋습니다.
중간결과집합 대비 최종결과로 질문하시면
중간결과집합을 구하는 과정을 알 수 없는 상태에서 답변을 드리게 되는데
이는 중간에서 최종으로 가는 답변일 뿐
원본에서 최종결과를 뽑는 최적의 방안이 아닐 수도 있습니다.

WITH t AS
(
SELECT 'A001' dept, '0001' emp, '0002' ra_emp, 1.234 score FROM dual
UNION ALL SELECT 'A001', '0001', '0003', 1.236 FROM dual
UNION ALL SELECT 'A001', '0001', '0004', 1.235 FROM dual
UNION ALL SELECT 'A001', '0001', '0005', 1.235 FROM dual
UNION ALL SELECT 'A001', '0002', '0001', 2.214 FROM dual
UNION ALL SELECT 'A001', '0002', '0003', 2.216 FROM dual
UNION ALL SELECT 'A001', '0002', '0004', 2.215 FROM dual
UNION ALL SELECT 'A001', '0002', '0005', 2.215 FROM dual
UNION ALL SELECT 'A001', '0003', '0001', 1.750 FROM dual
UNION ALL SELECT 'A001', '0003', '0002', 1.752 FROM dual
UNION ALL SELECT 'A001', '0003', '0004', 1.751 FROM dual
UNION ALL SELECT 'A001', '0003', '0005', 1.751 FROM dual
UNION ALL SELECT 'A001', '0004', '0001', 2.850 FROM dual
UNION ALL SELECT 'A001', '0004', '0002', 2.852 FROM dual
UNION ALL SELECT 'A001', '0004', '0003', 2.851 FROM dual
UNION ALL SELECT 'A001', '0004', '0005', 2.851 FROM dual
UNION ALL SELECT 'A001', '0005', '0001', 1.750 FROM dual
UNION ALL SELECT 'A001', '0005', '0002', 1.752 FROM dual
UNION ALL SELECT 'A001', '0005', '0003', 1.751 FROM dual
UNION ALL SELECT 'A001', '0005', '0004', 1.751 FROM dual
)
SELECT a.dept
     , a.emp
     , a.ra_emp
     , a.score
     , b.avg_score
     , b.rk
  FROM t a
     , (SELECT dept, emp
             , AVG(score) avg_score
             , RANK() OVER(PARTITION BY dept ORDER BY AVG(score)) rk
          FROM t
         GROUP BY dept, emp
        ) b
 WHERE a.emp = b.emp
 ORDER BY dept, emp, ra_emp
;

 
마농(manon94)님이 2025-01-17 10:44에 작성한 댓글입니다.
이 댓글은 2025-01-17 10:57에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
42003Oracle 캐릿터셋 변경 후 EXPDP 오류 확인 부탁드립니다.
JP_Kor
2025-01-08
44
42001조직별, 점수별 순위 지정 RANK 함수 [5]
IT재벌
2024-12-10
149
42000쿼리 질문 드립니다. 도움 부탁 드려요 [1]
김창기
2024-11-19
173
41999오라클 jdbc url 로 암호화 접속방법
도와주세요
2024-10-21
257
41998oracle to postgresql dblink (odbc) 로 데이터 조회 시 한글깨짐현상. [2]
디비에이
2024-07-10
494
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v17.2로 자료를 관리합니다