목록리트코드 (17)
오랑우탄의 반란
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lEwag/btsI7sZ0LWI/jUjSc8Kz8NZDaIjtmduJTK/img.png)
오늘도 오랑이는 문제를 풉니다. 1484. Group Sold Products By The Date 풀이 과정 products 칼럼 출력 방법 외에는 쉬운 문제입니다. 우선 아래와 같이 코드를 작성해줍니다. SELECT SELL_DATE, COUNT(DISTINCT PRODUCT) AS NUM_SOLDFROM ACTIVITIESGROUP BY 1ORDER BY 1; 이제 products 칼럼을 추가해야 하는데, product 의 각 행을 sell_date 기준으로 묶어서 쉼표(,)로 구분지어 오름차순으로 한 줄에 나열되게 출력해야 하는데요, CONCAT 을 바로 떠올리겠지만 그룹화가 어려워 보입니다. 이때 사용할 수 있는 함수가 바로 GROUP_CONCAT 입니다. GROUP_CONCATGROUP ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/AbPh8/btsIXIvcYYM/fkDhLU20trmZqI4TXcCCZk/img.png)
오늘도 오랑이는 문제를 풉니다. 185. Department Top Three Salaries 풀이 과정각 부서별로 월급 순위 매기기 dense_rank순위가 3 이하인 사람 select윈도우 함수로 순위 추출하는 방법을 알면 간단한 문제입니다.추출할 칼럼과 부서별 월급이 큰 순으로 정렬해 순위를 추출해주는 칼럼을 select 합니다. select d.name as Department, e.name Employee, Salary, dense_rank() over (partition by d.name order by salary desc) as rnfrom employee e join department d on departmentId = d.id RANK vs DENSE_RANKRANK 함수를 사..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/9T00T/btsIWRrUrKP/h3UqU7l4pEbntwlPFDWg4k/img.png)
오늘도 오랑이는 문제를 풉니다. 602. Friend Requests II: Who Has the Most Friends 풀이 과정requester_id 와 accepter_id 칼럼에서 가장 자주 등장한 수 = idid 가 등장한 회수 카운트 = num친구추가는 한쪽이 하면 자동으로 다른쪽도 한거와 마찬가지기 때문에 requester_id 와 accepter_id 두 칼럼 모두에서 가장 많이 등장한 수를 찾아야 합니다. 즉 두 칼럼을 union해서 개수를 세어야 합니다.select requester_id as id from RequestAccepted union allselect accepter_id as id from RequestAccepted 여기에서 id별로 그룹하고 개수를 센 칼럼 num 기..
![](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..