프로그래머스SQL - (SELECT), (SUM,MAX,MIN), (GROUP_BY)

2400·2021년 10월 20일
0

SQL 공부

목록 보기
3/3

- 모든 레코드 조회하기 : too easy

SELECT * from ANIMAL_INS as ani_i
ORDER BY ani_i.ANIMAL_ID
  • 역순 정렬하기 : too easy
SELECT NAME, DATETIME from ANIMAL_INS as ani_i
ORDER BY ani_i.ANIMAL_ID desc
  • 아픈 동물 찾기 : too easy
SELECT ANIMAL_ID, NAME from ANIMAL_INS as ani_i
WHERE 1=1
AND INTAKE_CONDITION ='Sick'
ORDER BY ANIMAL_ID asc;
  • 어린 동물 찾기 : too easy ( 왜 쉬운 문제밖에 없지? )
SELECT ANIMAL_ID, NAME from ANIMAL_INS as ani_i
WHERE 1=1
AND INTAKE_CONDITION !='Aged'
ORDER BY ANIMAL_ID asc;
  • 동물의 아이디와 이름 : too easy ( 이상하다.. )
SELECT ANIMAL_ID, NAME from ANIMAL_INS as ani_i
WHERE 1=1
ORDER BY ANIMAL_ID asc;
  • 여러 기준으로 정렬하기 : too easy
SELECT ANIMAL_ID, NAME, DATETIME from ANIMAL_INS as ani_i
WHERE 1=1
ORDER BY NAME asc, DATETIME desc;
  • 상위 n개 레코드 : too easy
SELECT NAME from ANIMAL_INS as ani_i
WHERE 1=1
ORDER BY DATETIME asc
LIMIT 1;
  • 최대값 구하기 : too easy
SELECT DATETIME from ANIMAL_INS as ani_i
WHERE 1=1
ORDER BY DATETIME desc
LIMIT 1;

( 출제 의도에 맞는 답 )

SELECT max(datetime) as '시간' from animal_ins;
  • 최솟값 구하기
SELECT min(datetime) from animal_ins;
  • 동물수 구하기 : too easy .. 문제 왜이리 저퀄리티이지?
SELECT count(ANIMAL_ID) from ANIMAL_INS as ani_i
  • 중복 제거하기 : 내가 푼건 출제 의도가 아닌거 같은데...
SELECT count(*) from (
    SELECT NAME, count(ANIMAL_ID) from ANIMAL_INS as ani_i
    WHERE 1=1
    AND ani_i.NAME != 'NULL'
    GROUP BY ani_i.NAME
    ) as c;

( 출제 의도에 맞는 답 : 간단하게 DISTINCT 를 쓰자.. ㅠ )

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS;
  • 고양이와 개는 얼마나 있을까 : too easy
SELECT ANIMAL_TYPE, count(ANIMAL_ID) from ANIMAL_INS as ani_i
group by ani_i.ANIMAL_TYPE
order by ani_i.ANIMAL_TYPE asc;
  • 동명 동물 수 찾기 : 잠깐 고민했음. 서브쿼리를 써야하나? group by 로 agg(count) 된 쿼리 결과에는 having 절을 써야한다는 출제 의도로 보인다.
select NAME, count(*) from ANIMAL_INS
where 1=1
AND NAME != 'NULL'
group by NAME
HAVING count(*) > 1
order by NAME asc
  • 입양 시각 구하기 1 : HOUR(DATETIME) as HOUR 에서 as 이후 as HOUR 부분을 설정을 안해줘서 having 절에서 Hour 로 조건을 걸때 애를 먹었다.
select HOUR(DATETIME) as HOUR, count(*) from ANIMAL_OUTS
group by HOUR
HAVING 1=1
AND HOUR > 8
AND HOUR < 20
order by HOUR asc;
  • 입양 시각 구하기 2 : Very Hard (답변 못함) : 이 정도면 걍 group by로 쿼리한 뒤, numpy 로 반복문 돌리는게 나을것 같다. 그리고 실제 SQL에서 하는 짓도 이와 같은 행위를 반복한다.
SELECT HOUR, COUNT(OUTS.DATETIME) AS COUNT
FROM 
    (
        WITH RECURSIVE CTE AS
            (
                 SELECT 0 AS HOUR 
                 UNION ALL
                 SELECT 1 + HOUR AS HOUR 
                 FROM CTE
                 WHERE HOUR < 23
            )SELECT * FROM CTE 
    ) TIME
LEFT JOIN ANIMAL_OUTS OUTS ON HOUR(OUTS.DATETIME) = TIME.HOUR
GROUP BY HOUR
ORDER BY HOUR ASC
profile
공부용 혹은 정리용 혹은 개인저장용

0개의 댓글

관련 채용 정보