Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 중복 ID별 최고 금액 조회하기 — MAX()와 GROUP BY 완벽 가이드

데이터베이스 작업을 하다 보면 동일한 고객 ID가 여러 번 등록되어 있고, 각 ID에 해당하는 여러 금액 값 중에서 가장 큰 값(최대값)만 추출해야 하는 경우가 자주 발생합니다. MySQL에서는 MAX() 집계 함수와 GROUP BY 절을 함께 사용하면 이 문제를 아주 간단하게 해결할 수 있습니다.

1. 예제 테이블 생성하기

먼저 실습에 사용할 테이블을 만들어 보겠습니다. 고객 ID(CustomerId)와 금액(Amount) 두 개의 컬럼으로 구성된 테이블입니다.

mysql> create table DemoTable2003
(
    CustomerId int,
    Amount int
);
Query OK, 0 rows affected (0.65 sec)

2. 샘플 데이터 삽입하기

이제 INSERT 명령어를 사용해 중복된 고객 ID를 포함한 데이터를 입력합니다. 고객 101과 102의 데이터가 각각 여러 건 존재하도록 구성했습니다.

mysql> insert into DemoTable2003 values(101,560);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2003 values(102,1080);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable2003 values(101,570);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable2003 values(102,870);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable2003 values(101,460);
Query OK, 1 row affected (0.12 sec)

3. 전체 데이터 확인하기

SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable2003;

실행 결과는 다음과 같습니다.

+------------+--------+
| CustomerId | Amount |
+------------+--------+
|        101 |    560 |
|        102 |   1080 |
|        101 |    570 |
|        102 |    870 |
|        101 |    460 |
+------------+--------+
5 rows in set (0.00 sec)

위 결과를 보면 고객 ID 101은 3건(560, 570, 460), 고객 ID 102는 2건(1080, 870)의 데이터가 중복되어 저장되어 있는 것을 확인할 수 있습니다.

4. MAX()와 GROUP BY로 최고 금액 조회하기

이제 핵심인 쿼리입니다. GROUP BY로 고객 ID별로 데이터를 그룹화한 뒤, MAX() 함수로 각 그룹 내 최대 금액을 구합니다.

mysql> select CustomerId, max(Amount) from DemoTable2003
    group by CustomerId;

실행 결과는 다음과 같습니다.

+------------+-------------+
| CustomerId | max(Amount) |
+------------+-------------+
|        101 |         570 |
|        102 |        1080 |
+------------+-------------+
2 rows in set (0.00 sec)

결과 해석

  • 고객 ID 101: 560, 570, 460 중 최대값인 570이 반환되었습니다.
  • 고객 ID 102: 1080, 870 중 최대값인 1080이 반환되었습니다.

이처럼 GROUP BY CustomerId가 중복된 ID를 기준으로 행들을 그룹으로 묶어 주고, MAX(Amount)가 각 그룹 안에서 가장 큰 금액 하나만 선택해 주기 때문에 원하는 결과를 손쉽게 얻을 수 있습니다.

추가 팁

최소값이 필요하다면 MIN(), 평균값이 필요하다면 AVG(), 합계가 필요하다면 SUM() 함수를 같은 방식으로 사용하면 됩니다. 또한 결과 컬럼명을 더 읽기 좋게 바꾸고 싶다면 별칭(alias)을 활용하는 것도 좋습니다.

select CustomerId, max(Amount) as HighestAmount
from DemoTable2003
group by CustomerId;

이렇게 하면 결과 컬럼이 HighestAmount라는 명확한 이름으로 표시되어 가독성이 한층 향상됩니다.