min 최저값 후 group by 0 3 109

by Taems [Oracle 기초] [2018.04.16 11:02:36]


안녕하세요.  min으로 가장 빠른 수강 날자를 group by 하고 있는데요 아래 쿼리데로 하면 

수강코드 값이 같이 나와 아래 결과 값처럼 나오게 하고 싶습니다... 많은 조언 부탁드리겠습니다~

SELECT 
    수강코드, 수강자, MIN(수강일) 수강일
FROM
    수강데이터
GROUP BY 수강코드, 수강자;

 

수강코드 수강자 수강일
AA10018546 12689 20180326
BB10018549 12689 20180313
CC10021422 12689 20180316

 

결과===================================================

수강코드 수강자 수강일
BB10018549 12689 20180313
by 마농 [2018.04.16 11:43:36]
-- 0. 최초 수강일이 중복되는 경우도 고려해야 하지는 않는지 모르겠네요?

-- 1. 중복 무시하고 1건만 가져오기 --
-- 문자연결 후 MIN, Substring --
SELECT SUBSTR(MIN(수강일 || 수강코드), 9) 수강코드
     , 수강자
     , MIN(수강일) 수강일
  FROM 수강데이터
 GROUP BY 수강자
;
-- 집계함수 : KEEP  --
SELECT MIN(수강코드) KEEP(DENSE_RANK FIRST ORDER BY 수강일) 수강코드
     , 수강자
     , MIN(수강일) 수강일
  FROM 수강데이터
 GROUP BY 수강자
;
-- 분석함수 : ROW_NUMBER --
SELECT 수강코드, 수강자, 수강일
  FROM (SELECT 수강코드, 수강자, 수강일
             , ROW_NUMBER() OVER(PARTITION BY 수강자 ORDER BY 수강일) rn
          FROM 수강데이터
        )
 WHERE rn = 1
;

-- 2. 중복건 모두 가져오기 --
-- 분석함수 : RANK --
SELECT 수강코드, 수강자, 수강일
  FROM (SELECT 수강코드, 수강자, 수강일
             , RANK() OVER(PARTITION BY 수강자 ORDER BY 수강일) rk
          FROM 수강데이터
        )
 WHERE rk = 1
;
-- 서브쿼리 : IN SubQUery --
SELECT 수강코드
     , 수강자
     , 수강일
  FROM 수강데이터
 WHERE (수강자, 수강일) IN (SELECT 수강자
                                 , MIN(수강일) 수강일
                              FROM 수강데이터
                             GROUP BY 수강자
                            )
;
-- 조인 : InLine-View & Self Join --
SELECT a.수강코드
     , a.수강자
     , a.수강일
  FROM 수강데이터 a
     , (SELECT 수강자
             , MIN(수강일) 수강일
          FROM 수강데이터
         GROUP BY 수강자
        ) b
 WHERE a.수강자 = b.수강자
   AND a.수강일 = b.수강일
;
-- 서브쿼리 : Not Exists SubQUery --
SELECT 수강코드
     , 수강자
     , 수강일
  FROM 수강데이터 a
 WHERE NOT EXISTS (SELECT 0
                     FROM 수강데이터 b
                    WHERE b.수강자 = a.수강자
                      AND b.수강일 < a.수강일
                   )
;
-- 조인 : Self Outer Join & Null Check --
SELECT a.수강코드
     , a.수강자
     , a.수강일
  FROM 수강데이터 a
  LEFT OUTER JOIN 수강데이터 b
    ON a.수강자 = b.수강자
   AND a.수강일 > b.수강일
 WHERE b.수강자 IS NULL
;

 


by 우리집아찌 [2018.04.16 14:12:14]

흐헉... 


by Taems [2018.04.16 16:05:30]

정말 감사합니다~~~ 마농님..... 이렇게 다양하게 쿼리를 구성해볼 수 있다는거에 너무 놀랬습니다~

말씀하신데로 최초 수강일에 중복되는 경우도 따져봤는데요 수강코드와 수강자가 같은 경우가 없어 중복이 되지 않을거 

같습니다~

알려주신 쿼리 잘 응용해서 사용하겠습니다~^^ 

즐거운 한주 되세요~ 마농님~~^^

 

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