SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 18일차(3) 26.01.16(금)

nom_de_plume 2026. 1. 16. 14:41

부제:

최댓값 구하기, 레벨 4

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/59415
2. 정답 코드: 

=> 정렬과 개수 제한 활용

SELECT
    datetime as '시간'
FROM animal_ins
order by datetime desc
limit 1

=> 집계 함수 활용

SELECT max(datetime) as '시간'
FROM animal_ins

=> MAX() 함수를 사용한 서브쿼리

SELECT datetime AS '시간'
FROM animal_ins
WHERE datetime = (
    SELECT MAX(datetime) 
    FROM animal_ins
);

=> ORDER BY와 LIMIT을 사용한 서브쿼리

SELECT datetime AS '시간'
FROM animal_ins
WHERE datetime = (
    SELECT datetime 
    FROM animal_ins 
    ORDER BY datetime DESC 
    LIMIT 1
);


3. 오류 상황:

SELECT
    datetime as '시간'
FROM animal_ins
where datetime in (
    select datetime
    from animal_ins
    having max(datetime)
)

=> HAVING절의 잘못된 위치

=> 서브쿼리가 반환하는 값의 개수

 

4. 시도 방법:

=> ORDER BY와 LIMIT 사용

=> MAX() 사용


5. 최종 문제 해결 방법:

=> GROUP BY 없이 HAVING만 사용하면 문법 오류가 나거나, 시스템에 따라 테이블 전체를 하나의 그룹으로 보고 결과를 내놓기도 하지만, HAVING max(datetime)처럼 조건식(=, >, < 등) 없이 함수만 단독으로 쓰면 SQL이 "무엇과 비교해야 하는지" 알 수 없다. HAVING절을 제거해도 무방

=> 서브쿼리(select datetime from animal_ins)에 아무런 제한(LIMIT)이 없으면, 테이블에 있는 모든 날짜 데이터를 다 불러와 WHERE datetime IN (전체 날짜)가 되어버려, 결국 가장 최근 날짜 하나만 뽑는 게 아니라 테이블의 모든 행을 다 출력하게 됩니다. 필터링 역할을 전혀 하지 못하게 되는 것이다. MAX()함수를 사용하거나 LIMIT 사용