안녕하세요. min으로 가장 빠른 수강 날자를 group by 하고 있는데요 아래 쿼리데로 하면
수강코드 값이 같이 나와 아래 결과 값처럼 나오게 하고 싶습니다... 많은 조언 부탁드리겠습니다~
SELECT
수강코드, 수강자, MIN(수강일) 수강일
FROM
수강데이터
GROUP BY 수강코드, 수강자;
수강코드 | 수강자 | 수강일 |
AA10018546 | 12689 | 20180326 |
BB10018549 | 12689 | 20180313 |
CC10021422 | 12689 | 20180316 |
결과===================================================
수강코드 | 수강자 | 수강일 |
BB10018549 | 12689 | 20180313 |
-- 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 ;