today's alogrithm

[프로그래머스] SQL 고득점 Kit - oracle sql

UR'im 2021. 2. 4. 20:36

■ IS NULL KIT

  • level 1 이름 없는 동물의 아이디
  • level 1 이름 있는 동물의 아이디
  • level 2 NULL 처리

 ▷ level 1 이름 없는 동물의 아이디 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59039

 

코딩테스트 연습 - 이름이 없는 동물의 아이디

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC

 

 ▷ level 1 이름 있는 동물의 아이디 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59407

 

코딩테스트 연습 - 이름이 있는 동물의 아이디

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC

 

 ▷ level 2 NULL 처리 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59410

 

코딩테스트 연습 - NULL 처리하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_TYPE, CASE 
                    WHEN NAME IS NULL THEN 'No name'
                    ELSE NAME END as NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

-한줄 평 : 마지막 문제 빼고는 IS NULL, IS NOT NULL 문법만 알면 풀 수 있는 문제,,,, 역시 레벨 1이다. 딱히 할 말이 없다.

 

■ STRING, DATE KIT

  • level 2 루시와 엘라 찾기
  • level 2 중성화 여부 파악하기
  • level 3 오랜 기간 보호한 동물(2)
  • level 2 DATETIME에서 DATE로 형 변환

 ▷ level 2 루시와 엘라 찾기 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59046

 

코딩테스트 연습 - 루시와 엘라 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Ella','Lucy','Pickle','Rogan','Sabrina','Mitty')
ORDER BY ANIMAL_ID ASC

 

 ▷ level 2 중성화 여부 파악하기 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59409

 

코딩테스트 연습 - 중성화 여부 파악하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID, NAME, CASE WHEN SEX_UPON_INTAKE LIKE '%Intact%' THEN 'X'
                             ELSE 'O' END as 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

 ▷ level 3 오랜 기간 보호한 동물 (2) [oracle] 

programmers.co.kr/learn/courses/30/lessons/59411

 

코딩테스트 연습 - 오랜 기간 보호한 동물(2)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID, NAME
FROM (
    SELECT i.ANIMAL_ID, i.NAME
    FROM ANIMAL_INS i, ANIMAL_OUTS o
    WHERE i.ANIMAL_ID = o.ANIMAL_ID
    ORDER BY o.DATETIME - i.DATETIME DESC
    )
WHERE ROWNUM <= 2

이 문제에서  포인트 는 FROM절 서브쿼리에서 입양 일 - 보호소 들어온 날을 기준으로 정렬 시킨다. 

참고로 만약에 ORDER BY를 서브쿼리가 아닌 메인 쿼리에서 쓴다면 WHERE절이 먼저 읽힘으로 정렬되지 않은 상태에서 위에서 2번째까지의 쿼리가 출력된다.

 

 ▷ level 2 DATETIME에서 DATE로 형 변환 [oracle] 

programmers.co.kr/learn/courses/30/lessons/59414

 

코딩테스트 연습 - DATETIME에서 DATE로 형 변환

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

SELECT ANIMAL_ID, NAME, to_char(DATETIME, 'yyyy-mm-dd') as 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC

 

■ GROUP BY KIT

  • level 4 입양 시각 구하기 (2)

 ▷ level 4 입양 시각 구하기 (2) [oracle] 

programmers.co.kr/learn/courses/30/lessons/59413

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

SELECT L.hour as HOUR, nvl(count(time.hour), 0) as count
FROM (
    select to_char(datetime, 'HH24') hour
    from ANIMAL_OUTS
    ) time, (select LEVEL-1 as hour FROM dual CONNECT BY LEVEL<=24) L
WHERE L.hour = time.hour(+)
GROUP BY L.hour
order by L.hour asc

참고로 KIT 문제들 중 이 문제가 가장 어려웠다고 느꼈다. 왜냐면 없는 데이터를 어떻게 만들어서 응용할까 고민해야 했기 때문인데, 생각보다 답이 쉬워서 씁쓸했다. 

더미 테이블 dual 을 활용하여 00 부터 23까지의 시간 테이블을 만든다. 만들어진 더미 테이블과 24시간으로 정렬된 time 테이블을 아우터 조인하여 시간은 00부터 23까지 표현하기 때문에 더미 테이블 L을 사용하고, 카운팅 할 때는 time테이블의 hour을 사용하여 Null값을 0으로 표현해준다. 이때 사용하는 함수는 nvl을 사용한다.

'today's alogrithm' 카테고리의 다른 글

[BOJ] 1254번 팰린드롬 만들기 - JAVA  (0) 2021.06.17
[BOJ] 이분 탐색 단계 - JAVA  (0) 2021.02.06
[BOJ] 정렬 단계3 - JAVA  (0) 2021.02.03
[BOJ] 정렬 단계2 - JAVA  (0) 2021.02.02
[BOJ] 정렬 단계 - JAVA  (0) 2021.01.31