최대값(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)
만약 같은 최대값이 여러개 존재 한다면 중복 처리를 해 줘야 한다.
'코딩 > SQL_Query' 카테고리의 다른 글
[MySQL] MAX(), MIN() 함수 사용 시 조건 추가 (0) | 2023.06.29 |
---|---|
[MSSQL] CONVERT 시 DATETIME FORMAT 지정 (LIKE) (0) | 2023.05.19 |
MySQL - SELECT 결과로 UPDATE, JOIN 하여 UPDATE (0) | 2023.02.16 |
MySQL, PHP 주기별 (주간 / 일간 / 월간) 합계, 매출 데이터 구하기 (0) | 2023.01.25 |
[MySQL] 초성 검색 함수 생성, 활용 (2) | 2022.10.04 |