728x90
특정 데이터들의 기록을 담은 A_his 이 있을 때 테이블 구조는 아래와 같다.
컬렴명(한글) | 컬럼명(영문) | 데이터 타입 |
마스터 코드 | MST_CD | varchar(10) |
서브코드 | SUB_CD | varchar(10) |
데이터 저장일시 | INPT_DT | DATETIME |
이 때 동일한 하나의 마스터 코드에 여러 서브 코드가 저장될 수 있는 구조이다.
MST_CD | SUB_CD | INPT_DT |
MST_1 | SUB_1 | 2024-04-01 13:53:56.000 |
MST_2 | SUB_2 | 2024-04-02 13:53:56.000 |
MST_1 | SUB_3 | 2024-04-04 13:53:56.000 |
MST_3 | SUB_3 | 2024-05-01 13:53:56.000 |
쿼리를 통해 얻고 싶은 결과는 각 마스터 코드당 가장 큰 서브코드와 그 데이터의 입력일시를 조회하는 것이다.
그래서 GROUP BY 절과 MAX 함수를 사용하여 아래의 쿼리를 작성하였다.
SELECT MST_CD, MAX(SUB_CD) AS max_SUB_CD, INPT_DT
FROM A
GROUP BY MST_CD
쿼리의 결과는 원하던 결과가 아니었다. 만약 제대로 나왔다면 이 글도 작성하지 않았을테니
조회 결과는 전혀 예상치 못한 결과였고 분석 결과 MST_CD 당 가장 큰 SUB_CD를 조회하는 것 까지는 맞았으나 INPT_DT가 여러 MST_CD 데이터 중 가장 위에있는(과거) 데이터를 가져왔다.
즉 위의 데이터 예시로 설명하면 MST_1, SUB_3 는 정상적으로 조회했는데 INPT_DT 가 1행의 데이터를 가져온 것이다.
원인은 어떤 INPT_DT를 가져올 지 제대로 정의하지 않았기에 발생한 문제였다. 이는 DB 종류 및 엔진 설정에 따라 다를 수 있는 값으로 정확하게 어떤 INPT_DT를 조회할 지 쿼리에 적어주면 해결될 문제이다.
때문에 쿼리는 아래와 같이 수정하였고
SELECT A.APP_SN, A.MONIT_STAT, A.INPT_DT
FROM (
SELECT MST_CD, MAX(SUB_CD) AS max_SUB_CD
FROM A
GROUP BY MST_CD
) B
JOIN A A
ON B.MST_CD = A.MST_CD AND B.max_SUB_CD = A.SUB_CD
예상했던 데이터와 일치하는 데이터를 조회할 수 있었다.