최대값(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)
만약 같은 최대값이 여러개 존재 한다면 중복 처리를 해 줘야 한다.