본문 바로가기

코딩테스트/SQL - 프로그래머스

(31)
SQL 고득점 kit(SELECT) - 멸종위기의 대장균 찾기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/301651 풀이 https://school.programmers.co.kr/questions/75058 -- 풀이 쿼리 -- 각 세대별 자식 없는 개체 수(COUNT)와 그 세대(GENERATION)를 출력 -- 세대에 대해 오름차순 정렬. -- 각 세대별 자식 없는 개체가 적어도 1개체는 존재함 -- 부모 없는 세대 -> 1세대 -- 1세대가 부모인 세대 -> 2세대 -- 2세대가 부모인 세대 -> 3세대 -- ... => 재귀문 사용! WITH RECURSIVE GEN AS ( SELECT ID, PARENT_ID, 1 AS GENERATION FROM ECOLI_DATA WHE..
SQL 고득점 kit(String, Date) - 오랜 기간 보호한 동물(2) 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/59411 풀이 https://school.programmers.co.kr/questions/75013 -- 풀이 쿼리 -- 입양 간 동물 중 보호기간이 가장 길었던 동물 2마리의 아이디와 이름 조회 -- 보호기간 긴 순으로 조회 SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID ORDER BY TIMESTAMPDIFF(MINUTE, I.DATETIME, O.DATETIME) DESC LIMIT 2 - DATETIME이 분 단위이므로 DATEDIFF()보단 TIMESTA..
SQL 고득점 kit(String, Date) - 조건에 맞는 사용자 정보 조회하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/164670 풀이 https://school.programmers.co.kr/questions/74925 좀 생각해볼 만한 부분은 전화번호 사이에 하이픈을 어떻게 넣는가인데, 이 부분에 대해서 2가지 풀이방법으로 풀어 보았다. -- 풀이 1. JOIN 없음, 서브쿼리 / INSERT 사용 SELECT USER_ID , NICKNAME , CONCAT(CITY, ' ', STREET_ADDRESS1, ' ', STREET_ADDRESS2) AS '전체주소' , INSERT(INSERT(TLNO, 8, 0, '-'), 4, 0, '-') AS '전화번호' FROM USED_GOODS_US..
SQL 고득점 kit(String, Date) - 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/164671 풀이 https://school.programmers.co.kr/questions/74836 -- 풀이 쿼리 -- 파일경로 : /home/grep/src/BOARD_ID -- 파일 이름 : 파일ID, 파일이름, 파일확장자로 구성됨 -- 조회수가 가장 높은 게시물은 유일함. SELECT CONCAT('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH FROM USED_GOODS_FILE WHERE BOARD_ID = ( SELECT BOARD_ID FROM USED_GOODS_BOARD O..
연도별 대장균 크기의 편차 구하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/299310 풀이 https://school.programmers.co.kr/questions/74723 # 풀이 쿼리 SELECT YEAR(DIFFERENTIATION_DATE) AS YEAR , MAX(SIZE_OF_COLONY) OVER(PARTITION BY YEAR(DIFFERENTIATION_DATE)) - SIZE_OF_COLONY AS YEAR_DEV , ID FROM ECOLI_DATA ORDER BY YEAR, YEAR_DEV 윈도우 함수만 잘 사용하면 굳이 JOIN이나 서브쿼리, CTE 등을 사용할 필요가 없는 쉬운 문제다.
우유와 요거트가 담긴 장바구니 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/62284#qna 풀이 https://school.programmers.co.kr/questions/74722 # 풀이 쿼리 SELECT DISTINCT CART_ID FROM CART_PRODUCTS WHERE NAME ='Yogurt' AND CART_ID IN ( SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'MILK') ORDER BY CART_ID 조금만 생각해보면 간단한 문제다. 요거트(혹은 우유)가 담긴 장바구니의 ID 중 우유(혹은 요거트)가 담긴 장바구니의 ID를 찾으면 되는 것이다. 서브쿼리 하나만 사용하면 된다. JOIN이나 ..
특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/298519 풀이 https://school.programmers.co.kr/questions/74349 -- 풀이 쿼리 SELECT COUNT(FISH_TYPE) AS FISH_COUNT , MAX(LENGTH) AS MAX_LENGTH , FISH_TYPE FROM FISH_INFO GROUP BY FISH_TYPE HAVING AVG(IFNULL(LENGTH, 10)) >= 33 ORDER BY FISH_TYPE 크게 어려울 것은 없는 문제였지만, 한가지 주의할 점이 있다(본인만 주의하면 될 듯...ㅎ) 그건 바로 WHERE절엔 집계함수를 쓸 수 없다는 것. 여러번 이 때문에 헤..
SQL 고득점 kit(JOIN) - 상품을 구매한 회원 비율 구하기 프로그래머스 문제 https://school.programmers.co.kr/learn/courses/30/lessons/131534#qna 풀이 https://school.programmers.co.kr/questions/74261 -- 풀이 쿼리 -- 2021년 가입 회원 중 구매기록이 있는 회원 수와 -- 2021년에 가입한 전체 회원 중 해당 회원들(=2021년 가입 회원 구매기록이 있는 회원들)의 비율을 -- 년, 월별로 출력. -- 비율은 소수점 첫째자리까지만 -- 전체 결과는 연 기준 오름차순, 월 기준 오름차순 정렬 WITH N AS ( SELECT COUNT(DISTINCT USER_ID) AS N_CUSTOMERS FROM USER_INFO WHERE YEAR(JOINED) = '202..