안녕하세요. min으로 가장 빠른 수강 날자를 group by 하고 있는데요 아래 쿼리데로 하면
수강코드 값이 같이 나와 아래 결과 값처럼 나오게 하고 싶습니다... 많은 조언 부탁드리겠습니다~
SELECT
수강코드, 수강자, MIN(수강일) 수강일
FROM
수강데이터
GROUP BY 수강코드, 수강자;
수강코드 | 수강자 | 수강일 |
AA10018546 | 12689 | 20180326 |
BB10018549 | 12689 | 20180313 |
CC10021422 | 12689 | 20180316 |
결과===================================================
수강코드 | 수강자 | 수강일 |
BB10018549 | 12689 | 20180313 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | -- 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 ; |