DATA 전문가로 가는 길

[SQL] MariaDB/MySQL MAX/MIN 최고값 최저값의 세부 속성 데이터 활용하기(최고일시, 최저일시 등) 본문

Data Architecture/SQL Query

[SQL] MariaDB/MySQL MAX/MIN 최고값 최저값의 세부 속성 데이터 활용하기(최고일시, 최저일시 등)

EstenPark 2017. 3. 24. 14:00


GROUP BY에서 MAX/MIN 함수를 응용한 세부 속성 데이터를 가져갈 수 있도록 하는 방안이며, 만약 최고값의 날짜를 구하려면 정렬된 순서에 의한 데이터를 하나씩 증가해서 큰 값을 올리는 사용자 변수를 응용할 수밖에 없습니다. 그러나 제일 큰 문제는 전체 집합을 구할 때 대용량 데이터라면 속도 문제를 발생 시킬 수 있습니다. 


집계 데이터를 뽑을 때 한 번에 작업 후 문자열을 잘라서 사용할 수 있다고 하면, 성능적인 이슈를 해결할 수 있습니다.


1. 샘플 데이터 (시스템 서버의 디스크 사용 이력)

  - SYS_SVR_NO : SERVER 번호

  - DIR_NM : 시스템 디렉토리(파티션 별) 명

  - GART_DT : 수집일자

  - FILE_SYS_NM : 시스템 파티션 명

  - ALL_CAP : 전체 용량

  - USE_CAP : 현재 사용한 용량

  - USE_ABLE_CAP : 현재 사용 가능한 용량

  - ALL_USE_RT : 전체 사용률(%)



2. 쿼리 작성

  - 시스템 서버 + 디렉토리명을 기준으로 최고 사용률, 최고 사용률의 일시(시간), 최저 사용율, 최저 사용율의 일시(시간)

  - 그룹 집합에서 최고, 최저에 대한 세부 항목을 가져 옵니다.

SELECT    A.SYS_SVR_NO
         ,A.DIR_NM
         ,ROUND(A.AVG_USE_RT, 2) AS AVG_USE_RT
         ,CAST(TRIM(SUBSTRING_INDEX(A.MAX_ALL_DATA, '|', 1)) AS DECIMAL(6, 2)) AS MAX_USE_RT
         ,STR_TO_DATE(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(A.MAX_ALL_DATA, '|', 2), '|', -1)), '%Y%m%d%H%i%s') AS MAX_GART_DT
         ,CAST(TRIM(SUBSTRING_INDEX(A.MIN_ALL_DATA, '|', 1)) AS DECIMAL(6, 2)) AS MIN_USE_RT
         ,STR_TO_DATE(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(A.MIN_ALL_DATA, '|', 2), '|', -1)), '%Y%m%d%H%i%s') AS MIN_GART_DT
FROM      (SELECT    A.SYS_SVR_NO
                    ,A.DIR_NM
                    ,AVG(A.ALL_USE_RT) AS AVG_USE_RT
                    ,MAX(CONCAT(LPAD(ROUND(A.ALL_USE_RT, 2), 6, '0'), '|', DATE_FORMAT(A.GATR_DT, '%Y%m%d%H%i%s'))) AS MAX_ALL_DATA
                    ,MIN(CONCAT(LPAD(ROUND(A.ALL_USE_RT, 2), 6, '0'), '|', DATE_FORMAT(A.GATR_DT, '%Y%m%d%H%i%s'))) AS MIN_ALL_DATA
           FROM      EST_SYS_RESC_DISK A
           WHERE     1 = 1
           AND       A.GATR_DT BETWEEN '20160322' AND '20160630'
           GROUP BY  A.SYS_SVR_NO, A.DIR_NM) A
;



3. 최종 결과


Comments