목록쿼리 (8)
오랑우탄의 반란
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/btFD5v/btsIUvJeM0h/rNe0F7xqURQSWkciwvWLq0/img.png)
오늘도 오랑이는 문제를 풉니다. 1321. Restaurant Growth 풀이 과정주어진 날짜 중 7일에 대한 합과 평균을 구해야 하는 문제입니다. 윈도우 함수를 사용해 범위를 지정해서 특정 날짜 구간에 대해 집계를 할 수 있는데요, range로 날짜 범위를 구할 수 있습니다. 이때 interval 은 datatype 이 date 인 경우에만 사용 가능하다는 점을 주의해야 합니다. sum(amount) over (order by visited_on range between interval '6' day preceding and current row) as amount 해당 조건을 from 서브쿼리로 넣어주면 7일에 대한 합과 평균을 구할 수 있습니다. 이때 행이 중복으로 들어가지 않게 group by ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bN3E78/btsISMLt2Dh/Gxze9BLWX2coPzN5JTLZOk/img.png)
오늘도 오랑이는 문제를 풉니다. 1341. Movie Rating 풀이 과정두 조건에 대해 결과물을 출력해서 union 으로 연결해주는 문제입니다.첫번째 조건에 대해 MovieRating 과 Users 테이블을 조인해서 user_id 기준으로 그룹해 rating 의 개수에 대한 max를 구하는 것을 생각했었는데 쿼리를 실행해보니 오류가 뜨더군요. 다른 풀이를 참고했더니 더 간단한 방법으로 name 기준으로 group해서 rating 개수와 name 기준 정렬해서 맨 위의 결과 하나만 추출하면 조건에서 '동순위일 경우 알파벳순으로 먼저 오는 이름 출력'에 대한 조건을 자동으로 충족하게 됩니다. select name as results from movierating join users using(user_..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wZCFy/btsIQx2J8Z4/nd1aLpYv5dAmtyFnTmkQQ0/img.png)
오늘도 오랑이는 문제를 풉니다. 626. Exchange Seats 풀이 과정이번 문제에서는 다양한 풀이를 살펴볼 예정입니다. 1 max()우선 첫번째 풀이입니다. 이 풀이는 id 번호를 변경해서 student 를 거기에 맞춰주는 형식입니다. id가 홀수인 경우, 1을 더해주고, id가 홀수인 경우 1을 빼줍니다. 마지막 id가 홀수인 경우 그대로 둬야 하기 때문에 그거에 대한 조건도 적어줍니다. select case when id = (select max(id) from seat) and id % 2 = 1 then id when id % 2 = 1 then id + 1 else id - 1 end as id, studentfrom seat ord..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bsaMQ5/btsIJGcXOu9/tprQAYKGXk1AehSfnhv69k/img.png)
오늘도 오랑이는 문제를 풉니다. 1907. Count Salary Categories 풀이 과정첫 시도는 아래와 같이 각 가격에 대한 case를 나눠서 풀었습니다. 하지만 이렇게 풀 경우, 보이는 바와 같이 'Average Salary' 에 대한 칼럼이 나오지 않습니다. select case when income 50000 then 'High Salary' else 'Average Salary' end as category, count(account_id) as accounts_countfrom accounts group by category ifnull 로 count를 감싸는 것으로 해결되는 문제인가 싶었지만 생각을 해보니 오랑이가 작성한 case 문은 True/F..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bP3SSk/btsIHBRDb6o/uNNJDs2sUFYc0Td6iOx9p1/img.png)
오늘도 오랑이는 문제를 풉니다. 1204. Last Person to Fit in the Bus 풀이 과정turn 기준으로 정렬한 것에 대한 각 weight 의 누적합이 필요한 문제입니다.누적합을 구할 수 있는 방법은 self join 으로 sum, group by 하는 방법과, sum() over() window function 을 사용하는 방법 크게 두 가지가 있습니다. 누적합 윈도우 함수SELECT column1, column2, SUM(더할 칼럼) OVER (ORDER BY 정렬기준) as CumulativeSumFROM table_name; 사용예시SELECT Date, Sales, SUM(Sales) OVER (ORDER BY Date) as CumulativeSalesFROM daily_s..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bIIL47/btsIHm7d55c/6KPMp5g6shj8wnkpXPCi8K/img.png)
오늘도 오랑이는 문제를 풉니다. 1164. Product Price at a Given Date 풀이 과정CTE 를 사용해서 푸는 연습을 해봅니다. 우선 change_date 가 '2019-08-16' 보다 작거나 같은 경우에 대한 조건을 지정해줘야 합니다. 예전 프로그래머스 자동차 대여 문제와 동일한 방식으로 8월 16일에 대해서 1, 아니면 0으로 값을 지정해주고 sum 으로 묶어서 푸는 방식인줄 알았지만, 해당 경우는 8월 16일이 존재하는지 여부가 중요한 것인 반면, 이번 문제는 8월 16일까지의 가장 최신 값과 그 이후에 대한 값은 또 다르게 지정하는 경우여서 각각 분리해서 풀어야 했습니다. change_date 각 product_id별로 change_date 가 최신값인 행을 구해야 하는 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dXc0GW/btsIm4MQJQP/lj4INqEziRsTzdAqHEqVPK/img.png)
오늘도 오랑이는 문제를 풉니다. 한 번에 풀 수 있을 것처럼 생겨서 한 번에 풀리지 않아서 머리 싸맨 문제 중 하나입니다. 역시 오랑이는 아직 갈 길이 멉니다. 문제 설명 다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블과 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 자동차 종류 별 대여 기간 종류 별 할인 정책 정보를 담은 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블 입니다. 문제1. 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 2. 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력3. 대여 금액을 기준으..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/t6XGc/btsIlXllbHu/tdkDmkqMW1zQlaqqCryShk/img.png)
오늘도 오랑이는 문제를 풉니다. 동명 동물 수 찾기 풀이 과정예전에 풀었던 문제를 다시 살펴봤습니다. 기존 쿼리와 새로 작성한 쿼리를 비교해보면 having 으로 훨씬 간편하게 푼 걸 볼 수 있습니다. 다만 두번째 풀이에서 처음에 COUNT(*) 로 해서 오답이 나왔는데, 문제에서 NULL 값은 제외하라는 조건을 유의해서 COUNT(NAME) 으로 변경해야 정답이 나옵니다. COUNT(칼럼) 은 NULL 값 제외하고 집계됨 COUNT(*) 은 NULL 값의 행도 모두 집계됨 최종 코드# AFTERSELECT NAME, COUNT(NAME) AS COUNTFROM ANIMAL_INSGROUP BY 1HAVING COUNT(NAME) >=2ORDER BY 1# BEFORESELECT NAME, COUNTF..