신기한 쿼리가 있어서 질문 드립니다. 0 2 5,039

by 손님 [Oracle 기초] 분석함수 KEEP LPAD SUBSTR MIN [2011.08.28 17:11:28]


select lev
      ,substr( min(lpad(to_char(salary),10,'0')||emp_id),11 ) emp_id
      ,min(salary) sal
       from temp
       group by lev
      

직별별로 연봉이 제일 작은 사원id와 급여 지급을 나타내는 쿼리 인대요..
신기하게... emp_id가 맞게 나오네요...

기동안에는 rownum over 해왔는대..
원래 이렇게 나오는게 정상인가요??

CREATE TABLE TEMP
(
  EMP_ID      NUMBER                            NOT NULL,
  EMP_NAME    VARCHAR2(10 BYTE)                 NOT NULL,
  BIRTH_DATE  DATE,
  DEPT_CODE   VARCHAR2(6 BYTE)                  NOT NULL,
  EMP_TYPE    VARCHAR2(4 BYTE),
  USE_YN      VARCHAR2(1 BYTE)                  NOT NULL,
  TEL         VARCHAR2(15 BYTE),
  HOBBY       VARCHAR2(30 BYTE),
  SALARY      NUMBER,
  LEV         VARCHAR2(4 BYTE)
)
by 질문자 [2011.08.28 17:28:56]
지금까지는
SELECT *
FROM (
SELECT LEV
, EMP_ID
, SALARY
, ROW_NUMBER() OVER(PARTITION BY LEV ORDER BY SALARY ASC) AS T
FROM TEMP
) WHERE T = 1
여렇게 햇거든요..

by 마농 [2011.08.28 22:31:41]
분석함수가 없던 시절 요긴하게 쓰이던 쿼리입니다.
그닥 이상할게 없는 쿼리인데요.
문자열에 대한 min 값을 구해 substring 하는거네요.
salary를 일단 10자리로 고정시키고 emp_id를 붙인후
min 값을 구해 11자리부터 자르기. 즉, salary 빼고 emp_id만 가져오기 입니다.
keep 을 이용해 같은 결과를 얻을 수도 있습니다.
SELECT lev
, MIN(emp_id) KEEP(DENSE_RANK FIRST ORDER BY salary) emp_id
, MIN(salary) sal
FROM temp
GROUP BY lev
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입