[DEV SQL] 6. [MySQL, MariaDB] Select Gruop In Group order by date desc(그룹 안에 그룹 별 날짜 순차정렬)


[MySQL/MariaDB] Select Gruop In Group order by date desc(그룹 안에 그룹 별 날짜 순차정렬)
의도하는 포스팅 내용과 포스팅이 제목이 애매하긴 하지만 우선 작성



예제 테이블

DEPARTMENT(부서)

컬럼컬럼명
IDX부서_idx
DP_NAME부서명


EMPLOYEE(직원)

컬럼컬럼명
IDX직원_idx
DEPARTMENT_IDX부서_idx
POSITION직책
NAME직원명
JOIN_DATE입사일


SELECT 기대 결과

각 부서(그룹) 내 직책(그룹) 별로 입사일(날짜)이 제일 빠른 직원명을 select 하는 것이다.
물론 실무 테이블은 아니기에 비슷하게 테이블구조와 요구조건을 생각했다.

group by를 date 로 할 경우 기본적으로 오름차순(ASC)이 적용된다.
그래서 내림차순(DESC)으로 select가 필요한 경우가 있어서 하다보니 포스팅을 작성을 하게 되었다.

해당 포스팅이 정답은 아닐 듯 하다…. 아마도 더 좋은 방법이 분명히 존재한다.


부서명직책직원명입사일
퍼블팀차장김동일2010-03-10 19:39:57
퍼블팀과장이예나2012-02-11 19:39:57
퍼블팀대리박민지2016-05-09 19:39:57
퍼블팀사원최진실2018-11-13 19:39:57
개발팀차장박정아2011-07-11 19:39:57
개발팀과장박준석2013-03-14 19:39:57
개발팀대리이준여2017-08-11 19:39:57
개발팀사원최상민2018-09-24 19:39:57



그룹 안에 그룹 별 날짜 순차정렬

SELECT
    S1.DEPARTMENT_IDX
    , S1.POSITION
    , ANY_VALUE( S1.NAME ) AS NAME
    , ANY_VALUE( S1.JOIN_DATE ) AS JOIN_DATE
FROM
    (
    SELECT
        E.DEPARTMENT_IDX
        , E.DP_NAME
        , E.POSITION
        , E.NAME
        , E.JOIN_DATE
        , CASE WHEN @GRP = POSITION THEN @ROWNUM:=@ROWNUM + 1 ELSE @ROWNUM :=1 END AS ROWNUM
        , (@GRP := POSITION) as dummy
    FROM 
        EMPLOYEE E
        INNER JOIN DEPARTMENT D ON E.DEPARTMENT_IDX = D.IDX
    ORDER BY 
        ROWNUM DESC
    ) S1
GROUP BY S1.DEPARTMENT_IDX, S1.POSITION


위에 쿼리를 실행하면 아마도 위에 기대결과 Select를 할 것이다.

그럼 전 이만.