본문으로 바로가기

mysql - max / min group by 주의할 점

category 코딩/SQL_Query 2023. 4. 10. 13:57

최대값(MAX) 또는 최소값(MIN) 자체만 뽑아낼 때는 문제가 없지만, 해당 row 의 다른 칼럼까지 조회를 하려다 보면 고려해야 할 부분이 있다.

아래와 같은 테이블이 있다고 가정해 보자. score 칼럼의 데이터 타입은 숫자형이어야 한다.

MariaDB [samjin]> select * from tbl99;
+------+-------+-------+
| idx  | model | score |
+------+-------+-------+
| a    | 가a   |    60 |
| b    | 나b   |    50 |
| c    | 다c   |    40 |
| d    | 라d   |    30 |
| a    | 마a   |    20 |
| b    | 바b   |    10 |
| c    | 사c   |     0 |
| d    | 아d   |   100 |
| a    | 자a   |    90 |
| b    | 차b   |    80 |
| c    | 카c   |    70 |
| d    | 타d   |    60 |
| a    | 파a   |    50 |
| b    | 하b   |    40 |
+------+-------+-------+
14 rows in set (0.000 sec)

 

idx 별로 가장 높은 score를 조회하려면 아래와 같은 쿼리를 실행하면 된다고 생각할 수 있다.

그런데 model 칼럼을 보면 알 수 있듯이, 순차적으로 존재하는 중복 칼럼(idx) 중 첫번째 row가 보여진다.

MariaDB [samjin]> SELECT *, MAX(score) FROM tbl99 GROUP BY idx;
+------+-------+-------+------------+
| idx  | model | score | MAX(score) |
+------+-------+-------+------------+
| a    | 가a   |    60 |         90 |
| b    | 나b   |    50 |         80 |
| c    | 다c   |    40 |         70 |
| d    | 라d   |    30 |        100 |
+------+-------+-------+------------+
4 rows in set (0.001 sec)

 

이 경우 self join 하여 처리가 가능하다.

MariaDB [samjin]> SELECT a.* FROM tbl99 AS a
    -> JOIN ( SELECT idx, MAX(score) AS max_score FROM tbl99 GROUP BY idx ) AS b
    -> ON a.idx=b.idx AND a.score=b.max_score
    -> ORDER BY a.idx;
+------+-------+-------+------------+
| idx  | model | score | MAX(score) |
+------+-------+-------+------------+
| a    | 자a   |    90 |         90 |
| b    | 차b   |    80 |         80 |
| c    | 카c   |    70 |         70 |
| d    | 아d   |   100 |        100 |
+------+-------+-------+------------+
4 rows in set (0.001 sec)

 

만약 같은 최대값이 여러개 존재 한다면 중복 처리를 해 줘야 한다.