안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "최댓값 구하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/59415)
1. 문제 : 최댓값 구하기(Lv. 1)
2. 문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며,
ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는
각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
[ 테이블 구조 ]
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.
[ 예시 ]
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A399552 | Dog | 2013-10-14 15:38:00 | Normal | Jack | Neutered Male |
A379998 | Dog | 2013-10-23 11:42:00 | Normal | Disciple | Intact Male |
A370852 | Dog | 2013-11-03 15:04:00 | Normal | Katie | Spayed Female |
A403564 | Dog | 2013-11-18 17:03:00 | Normal | Anna | Spayed Female |
가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
[ 출력 결과 ]
시간 |
2013-11-18 17:03:00 |
(* 컬럼 이름(위 예제에서는 "시간")은 일치하지 않아도 됩니다.)
3. 문제 풀이
# 1안
SELECT DATETIME AS '시간'
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1
# 2안
SELECT MAX(DATETIME) AS '시간'
FROM ANIMAL_INS
이번 문제는 1안과 2안 두 가지로 작성했습니다!
# 1안 풀이 설명
## [ 문제 접근 설명 ]
예시를 보면 Anna가 'DATETIME' 컬럼의 값인 2013-11-18 17:03:00으로
모든 동물 중 가장 큰 늦게 들어왔다는 것을 알 수 있어요!
원하는 조회 결과는 동물의 이름이 아닌 'DATETIME' 인 것도 파악할 수 있습니다!
따라서 'DATETIME' 컬럼을 기준으로 내림차순 정렬해준 후 하나의 데이터만 조회하면 됩니다!
또는 'DATETIME'컬럼을 기준으로 가장 큰 값을 조회해주면 됩니다!
## [ 1안 쿼리 작성 설명 ]
ANIMAL_INS의 테이블에 존재하는 컬럼들이 [출력 결과]에 나와 있는 컬럼들과 동일하게
" SELECT "를 통해 'DATETIME' 컬럼만을 선택 후 컬럼명을 '시간'으로 나타나게 변경(Alias를 이용한 별칭 설정)
" ORDER BY DATETIME DESC"를 통해 'DATETIME' 컬럼을 기준으로 내림차순 정렬
" LIMIT 1 "을 통해 하나의 값만 조회하도록 쿼리를 작성했습니다!
## [ 2안 쿼리 작성 설명 ]
ANIMAL_INS의 테이블에 존재하는 컬럼들이 [출력 결과]에 나와 있는 컬럼들과 동일하게
" SELECT "를 통해 'DATETIME' 컬럼의 최댓값을 산출 후(MAX 함수를 이용한 최댓값 산출)
컬럼명을 '시간'으로 나타나게 변경(Alias를 이용한 별칭 설정)
이렇게 쿼리를 작성했습니다!
4. 데코의 문제 풀이 후기
이번 문제는 최댓값의 데이터를 조회하는 문제예요!
1안의 쿼리는 지난 포스팅에서 작성한 '상위 n개 레코드'문제와 거의 유사하네요!
(ORDER BY를 통한 정렬 후 LIMIT 문을 통해 하나의 행만 조회하기)
2안에서 나온 SQL의 함수인 MAX()은 처음 다뤄보네요!
SQL에서 MAX, MIN, SUM, COUNT, AVG 등 함수는 집계함수입니다!
- MAX : 컬럼의 최댓값을 산출
- MIN : 컬럼의 최소값을 산출
- SUM : 컬럼의 값을 합계를 산출
- COUNT : 컬럼의 갯수를 산출
- AVG : 컬럼의 평균값을 산출
집계함수를 통해 원하는 컬럼의 값을 산출해서 조회할 수 있어요!
ex) 가장 늦게 들어온 동물의 날짜(DATETIME)
이 집계함수들은 주로 GROUP BY 문과 같이 사용돼요!
GROUP BY를 통해 묶은 그룹별로 집계함수를 적용하여 조회할 수 있습니다!
ex) 생물 종(ANIMAL_TYPE)에 따라 가장 늦게 들어온 동물의 날짜(DATETIME)
저도 데이터 분석 업무를 하면서 GROUP BY와 함께 집계함수를 많이 활용한 기억이 있네요!
정말 정말 많이 이용되는 쿼리입니다!
이번 문제는 최댓값의 데이터를 조회하는 문제를 풀어봤습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분은 그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해드릴게요!
공감과 댓글은 큰 힘이 됩니다!
읽어주셔서 감사해요!
또 다른 SQL 문제로 찾아뵐게요!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 고양이와 개는 몇 마리 있을까(프로그래머스/MySQL/Level 1) (16) | 2023.01.02 |
---|---|
[SQL] 강원도에 위치한 생산공장 목록 출력하기(프로그래머스/MySQL/Level 1) (16) | 2023.01.01 |
[SQL] 상위 n개 레코드(프로그래머스/MySQL) (8) | 2022.12.28 |
[SQL] 여러 기준으로 정렬하기(프로그래머스/MySQL) (13) | 2022.12.27 |
[SQL] 이름이 없는 동물의 아이디(프로그래머스/MySQL) (6) | 2022.12.26 |