결과내 랭킹매기는 쿼리 질문드립니다. 0 8 1,050

by playlyun [SQL Query] query [2017.08.07 11:26:15]


시간, 부서명, 이름, 득점 을 갖는 테이블이 있는데요.

 

시간순으로 검색해서 부서별로 득점이 가장높은 사람과 낮은사람을 찾으려고합니다.

 

1년단위로 검색하면 같은부서가 동시에 여러번 연속적으로 나오게되는데요.

 

그 연속적일때 그 시간범위에서만 랭킹을 매길순 없을까요?

 

다음 연속적으로 나올때는 따로 랭킹을 매기고..

by 마농 [2017.08.07 11:35:24]

너무 막연하네요.
예시 자료로 설명해 주세요.
원본 대비 결과표.


by playlyun [2017.08.07 12:20:57]

ㅠㅠ 허접한 죄송합니다.

A 테이블에

시간 부서 이름 득점
2017-08-07 11:11:12 개발 1 120
2017-08-07 11:11:13 개발 2 130
2017-08-07 11:11:14 개발 3 100
2017-08-07 11:15:11 관리 관리 11
2017-08-07 11:15:12 관리 관뤼 123
2017-08-07 11:15:13 개발 1 100
2017-08-07 11:15:14 개발 2 160
2017-08-07 11:15:16 개발 3 170
2017-08-07 11:15:18 폐기 패자 10

 

이런식으로 있으면

11:11 에 있었던 개발부서 1,2,3의 득점을 가지고 1등과 꼴지를 정하고

11:15에 있었던 개발부서 1,2,3의 득점을가지고 1등과 꼴찌를 따로 정하는...

 

그런것입니다!


by 마농 [2017.08.07 12:26:38]

결과표도 보여주시면 좋았을 것을?
개발부서만 설명하셨는데? 관리부서는?
간단하게 분단위로 부서별 랭킹을 보여주면 되는 건가요? 아니면 연속의 개념이 들어가야 하나요?


by playlyun [2017.08.07 13:38:09]

연속개념이 들어가야해요. 11분대에 연속된 개발부서의 기록만가지고 랭킹을 매기고 15분대에 연속된 개발부서의 랭킹을 매기고 분단위로는 안되구요.. 어렵네요


by 마농 [2017.08.07 13:44:38]

연속개념만 들어가면 될 듯 한데요?
11분대, 15분대 하는 분단위 개념은 필요 없겠죠?
예) 11분59초 와 12분 01초로 연속되는 경우 하나의 그룹이 될지? 분단위로 쪼갤지?


by playlyun [2017.08.07 13:47:28]

네 하나의 그룹으로 생각해서 랭킹을 매겨야해요.

 


by 마농 [2017.08.07 13:51:35]
WITH t AS
(
SELECT '2017-08-07 11:11:12' dt, '개발' dept, '1' nm, 120 scr FROM dual
UNION ALL SELECT '2017-08-07 11:11:13', '개발', '2'   , 130 FROM dual
UNION ALL SELECT '2017-08-07 11:11:14', '개발', '3'   , 100 FROM dual
UNION ALL SELECT '2017-08-07 11:15:11', '관리', '관리',  11 FROM dual
UNION ALL SELECT '2017-08-07 11:15:12', '관리', '관뤼', 123 FROM dual
UNION ALL SELECT '2017-08-07 11:15:13', '개발', '1'   , 100 FROM dual
UNION ALL SELECT '2017-08-07 11:15:14', '개발', '2'   , 160 FROM dual
UNION ALL SELECT '2017-08-07 11:15:16', '개발', '3'   , 170 FROM dual
UNION ALL SELECT '2017-08-07 11:15:18', '폐기', '패자',  10 FROM dual
)
SELECT dt, dept, nm, scr
     , RANK() OVER(PARTITION BY dept, rn1 - rn2 ORDER BY scr DESC) rk
  FROM (SELECT dt, dept, nm, scr
             , ROW_NUMBER() OVER(ORDER BY dt) rn1
             , ROW_NUMBER() OVER(PARTITION BY dept ORDER BY dt) rn2
          FROM t
        )
 ORDER BY dt
;

우선은, 순위 부여하는 쿼리 작성했는데요.
혹시 순위가 최종 목적이 아니라면?
1등의 이름과 꼴등의 이름을 가져오고 싶은 거라면?
1등이나 꼴등이 2명 이상일 수도 있겠네요.
이 경우 어떤 형태로 결과를 표현을 해야 할지 고민해 보셔야 합니다.


by playlyun [2017.08.07 14:43:46]

이해하는데 좀 걸렸네요 ㅠㅜ

두개 순서매겨서 빼버리니까 구분이 되버리네요. 옴총난 아이디어..

실마리를 얻었으니 좀더 파보겠습니다. 감사합니다.

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