19,800원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
set 1번 2번 문제 입니다.
안녕하세요 강사님 강의 잘 듣고 있습니다! set 1번의 2번 문제의 해석을 듣는 중 { inner join hackers as h on h.hacker_id = t.hacker_id group by h.hacker_id, h.name having total_score != 0 order by total_score desc, h.hacker_id } 부분에서 왜 group by시 h.name도 포함되는 모르겠습니다 h.hacker_id와 h.name은 각각 하나씩 연결되었음으로 h.name이 없어도 실행 되어야 할 것 같습니다. 또한 h.name을 제거하였을때 error가 발생하였는데 왜 발생하는지도 모르겠습니다. 좋은 강의 올려주셔서 감사합니다
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
조인 조건 질문드립니다
강사님 안녕하세요. 풀이에서 같은 users 테이블을 두번 inner join 하시지요. (영상 11분) 저는 다음과 같이 작성했어요. (서브쿼리 부분만 옮겨 적을게요) FROM (SELECT Request_at, count(*) as total_count, SUM(CASE WHEN status = 'completed' THEN 0 ELSE 1 END) as cancel_count FROM trips AS t INNER JOIN users AS U ON t.client_id = u.users_id OR t.driver_id = u.users_id WHERE (t.request_at BETWEEN '2013-10-01' AND '2013-10-03') AND u.banned = 'No' GROUP BY request_at) sub 같이 JOIN은 한번만 하고 ON을 두번 적어줬는데 값이 다르게 나오더라고요. user_id 중 client_id과 driver_id에 각각 매치되는 부분을 OR로 연결하면 될 것 같은데... 왜 안되는지 잘 모르겠습니다. 설명 부탁드릴게요!
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
FROM절 Sub Query 실행시 Sub Query 밖에 WHERE 절 써도 효과적으로 SELECT 되는지 알고 싶습니다.
일단 제목만 보고 이해가 안가실텐데요... 해당 강의에서 ROW_NUMBER() 를 쓰는거 보고 갑자기 의문이 생겨서 이렇게 질문을 드립니다. 만약 실제 회사에서 해당 경우에 ROW_NUMBER() 를 써도 되는것인지 의문이기도 해서요. 예를들자면 'API_HISTORY' 이라는 테이블이 있습니다. (참고로 약 400백만건 이상 데이터가 있습니다.) URL DATE METHOD /api/members 2021-02-12 13:43:35 POST /api/categories/2 2021-02-13 23:34:55 GET /api/members 2021-02-14 02:23:43 POST SELECT * FROM ( SELECT URL, DATE, ROW_NUMBER() OVER (PARTITION BY sub.URL ORDER BY sub.DATE DESC) AS 'rank' FROM API_HISTORY AS sub ) AS T WHERE T.`rank` = 2 이렇게 FROM 절에 sub query로 'API_HISTORY' 테이블 SELECT 먼저 하는데요. 해당 서브 쿼리를 잘 보시면 이번 강의때 배운 ROW_NUMBER() 를 사용해 보았습니다. 그런다음 rank를 맺긴것을 이용해서 WHERE절을 이용하기 위해 FROM절로 다시 감싸서 각 URL마다 rank(DATE DESE 기준) 2위 만 SELECT 할려고 합니다. 그런데 문제는 'API_HISTORY' 테이블은 400백만건이 있기 때문에 형식상 저 query를 실행하게 되면 sub Query가 먼저 실행되고(결국 이때 400백만건을 모두 조회한 셈???인가요??) 다 조회한뒤 WHERE 절 rank 2위만 SELECT 하는것 같습니다. 다시 말씀드리자면 일반적인 SELECT문 경우 WHERE절이 있다면 그걸 필터링 해서 가져오기 떄문에 성능상 빠르지만 해당 쿼리문은 FROM 절 SUB 쿼리를 실행하기 떄문에 먼저 서브쿼리 안에 있는것들을 SELECT 하고(약 400백만건 모두 조회 한다는 의미입니다.) 그다음에 WHERE절 통해 필터링 해서 더 늦게 출력되지 않을까 생각되는데요. 제가 잘못 이해하는것인가요? 답변 부탁드립니다^^ 좋은 하루 되세요 :)
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
개별 쿼리 연결 시
강사님 안녕하세요. 해당 문제 답을 SELECT city, length(city) length_city FROM station ORDER BY length_city, city LIMIT 1; SELECT city, length(city) length_city FROM station ORDER BY length_city DESC, city LIMIT 1 라고 UNION 없이 적으셨는데 쿼리가 돌아가서 놀랐어요. 저는 개별 쿼리를 연결하려면 UNION이 꼭 필요하다고 생각했거든요. 그럼 쿼리 연결할 때 UNION이 꼭 필요한 경우는 언제인가요?? 그냥 세미콜론 하나로 연결 가능하다면 UNION은 왜 존재하는지 혼란스럽습니다 ;_;
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
4set 2번 문제
안녕하세요. 아래 쿼리와 같이 SUM(CASE WHEN Status != 'completed'가 아닌 SUM(CASE WHEN Status = 'cancelled_by_driver ' 를 하면 틀린 답이라고 나옵니다. 같은 내용인거 같은데 왜 틀린지를 모르겠네요 ㅠ 확인해 주시면 감사하겠습니다. SELECT Day, ROUND(rate/total,2) AS `Cancellation Rate` FROM ( SELECT a.Request_at AS Day , SUM(CASE WHEN Status = 'cancelled_by_driver ' THEN 1 ELSE 0 END) AS rate , COUNT(*) as total FROM Trips a INNER JOIN Users uc ON a.Client_Id = uc.Users_Id INNER JOIN Users ud ON a.Driver_Id = ud.Users_Id WHERE a.Request_at BETWEEN '2013-10-01' AND '2013-10-03' AND uc.Banned = 'No' AND ud.Banned = 'No' GROUP BY 1 ) t
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
4set 2번 문제
4set 2번 문제 설명해주신 방법이 더 효율적인 건 알겠습니다. 저는 서브쿼리 2개써서 조인 하는 방식으로 풀어봤는데 뭐가 잘못된건 에러가뜨는데 잘 모르겠습니다. Users_id 조인할 때 어느 부분이 문제인가요? Duplicate column name 'Users_Id' select A.request_at as Day ,(select round(count(b.id)/count(A.id),2)) as 'Cancellation Rate' from ( select * from Trips T inner join users UC on T.client_id = UC.users_id inner join users UD on T.driver_id = UD.users_id where UC.banned = 'NO' and UD.banned = 'NO' and request_at between '2013-10-01' and '2013-10-03' ) A left join ( select * from Trips T inner join users UC on T.client_id = UC.users_id inner join users UD on T.driver_id = UD.users_id where UC.banned = 'NO' and UD.banned = 'NO' and request_at between '2013-10-01' and '2013-10-03' and status like 'cancelled%' ) B on a.id = b.id group by A.request_at
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
제가 풀어본 Ollivander's Inventory 문제 틀린 이유 알고 싶습니다.
SELECT w.id, wp.age, w.coins_needed, w.power FROM Wands AS w INNER JOIN Wands_Property AS wp ON (w.code = wp.code) INNER JOIN ( SELECT id, MIN(coins_needed) FROM Wands GROUP BY id, code, power ) AS T ON (w.id = T.id) WHERE wp.is_evil = 0 ORDER BY w.power DESC, wp.age DESC 이 SQL은 왜 틀린건가요? 출력은 되긴 하지만 틀리다고 나오네요. 조인 중에서 INNER JOIN ( SELECT id, MIN(coins_needed) FROM Wands GROUP BY id, code, power ) AS T 이부분이 핵심인데요. 결국 GROUP BY 를 id, code, power를 하나 code, power를 하나 같지 않는건가요? 결국 해당 GROUP BY 를 해서 coins_needed가 가장 작은 액수만 출력하게 했고 그것을 전체 출력해서 INNER JOIN통해 필터링 하는 전략을 세워보았습니다. 이론상 틀리지 않아 보이는데... 제 주관적인 생각입니다 ㅠㅠ 이유가 무엇일까요?
- 미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이
Ollivander's Inventory 질문드립니다.
안녕하세요, 저는 해당 문제를 group by를 이용해 풀어보려 했는데 id 컬럼 때문에 계속 오답 처리가 되더라구요. 혹시 문제 조건에서 id, age, coins_needed, power가 아닌 age, coins_needed, power 만 주어졌다면 group by 를 이용해서 풀어도 Window Function을 사용해 푼 풀이와 같은 결과가 출력될까요? 아래는 제가 Group by로 풀이한 코드입니다. 항상 좋은 강의 감사드려요! select id , age , min(coins_needed) , power from wands as w inner join wands_property as wp on w.code = wp.code where is_evil = 0 group by id, age, power order by power desc, age desc