다 너무 어려웠다....
HackerRank - Placements: https://www.hackerrank.com/challenges/placements/problem
이 사람의 베스트 프랜드가 이 사람보다 더 높은 연봉을 받고 있는 사람들을 출력하는 문제이다. 정렬은 친구의 월급으로 한다.
비교를 하기 위해서는 이 사람의 샐러리와 친구의 샐러리를 비교해야 하는데 같은 샐러리를 받고 있는 사람은 없다
-- JOIN으로 총 4개의 테이블을 생성 SELECT S.name FROM friedns F INNER JOIN students S ON F.id = S.id INNER JOIN pacakge P ON F.id = p.id -- 여기까지가 내 월급 INNER JOIN pacakges P2 ON F.friend_id = P2.id -- 여기가 베프 월급 WHERE P.salary < P2.salary -- 모두의 샐러리를 비교해야하니까 INNER JOIN ORDER BY P2.salary
HackerRank - Binary Tree Nodes: https://www.hackerrank.com/challenges/binary-search-tree-1/problem
루트 : P가 NULL이나 없는 것
리프 : N에는 있는데 P에는 없는 것
이너 : 둘다 아닌 경우
-- 1) JOIN을 사용한 풀이 SELECT DISTINCT b1.n, CASE WHEN b1.p IS NULL THEN 'root' -- 루트부터 생각해보면 WHEN b2.n IS NULL THEN 'leaf' -- 리프 찾기(WHEN을 써주면 if else와 비슷한 것) ELSE 'inner' END FROM bst b1 LEFT JOIN bst b2 -- JOIN이 되어서 b2의 N이 새 테이블로 옆에 달라부텄을 것 ON b1.n = b1.p -- n에도 있고 p에도 있는 경우에 이렇게 붙여줄 수 있다 ORDER BY 1
(캡쳐 사진 추가)
-- 서브쿼리를 사용한 풀이 SELECT n, CASE WHEN p IS NULL THEN 'Root' WHEN n IN (SELECT DISTINCT p FROM bst) THEN 'Inner' ELSE 'Leef' END FROM bst ORDER BY n;
HackerRank - Weather Observation Station 17 : https://www.hackerrank.com/challenges/weather-observation-station-17/problem
SELECT ROUND(long_w, 4) FROM station WHERE lat_n > 38.7780 ORDER BY lat_n LIMIT 1
-- MIN() 사용 풀이 SELECT ROUND(S1.long_w, 4) FROM station S1 WHERE S1.lat_n = (SELECT MIN(S2.lat_n) -- 서브쿼리 구조로 MIN() 값과 같은 값을 찾아준다 FROM station S2 WHERE S2.lat_n > 38.7780)
-- RANK()로 풀기 SELECT ROUND(long_w, 4) FROM (SELECT *, ROW_NUMBER() OVER(ODER BY lat_n) rnk -- OVER(이 정렬 기준으로) 가져오기 위해 rnk라는 별칭을 만들어준다. FROM station WHERE lat_n > 38.7780) A -- FROM에 서브쿼리를 줄 때는 이것이 일종의 테이블처럼 들어가기 때문에 꼭 별칭을 써줘야 한다. WHERE rnk = 1
HackerRank - Contest Leaderboard : https://www.hackerrank.com/challenges/contest-leaderboard/problem
SELECT H.hacker_id, H.name, SUM(max_score) total_score -- 각 사람당 토탈 스코어를 SUM()으로 구함 FROM (SELECT hacker_id, challenge_id MAX(score) max_score -- 이 부분으로 인해 같은 게 있으면 MAX만 남게됨 FROM submission GROUP BY hacker_id, challenge_id) A INNER JOIN hackers H -- name을 가져오기 위해 JOIN ON A.hacker_id = H.hacker_id GROUP BY H.hacker_id, H.name -- 사람당! 이니까 GROUP BY HAVING total_score > 0 -- GROUP BY의 조건이니까 HAVING ORDER BY total_scroe DESC, H.hacker_id
HackerRank - New Companies : https://www.hackerrank.com/challenges/the-company/problem
-- 서브쿼리를 사용한 풀이 -- 각각 카운팅해야 하는 것을 서브쿼리로 만들었음 - 기준이 되는 컴퍼니 코드만 맞춰주면 된다 -- WHERE company_code = C.company_code) => 이너조인의 매칭 조건과 같지! -- A inner join B on A.id = b.id -- from A, B where A.id = b.id 이 같은 거로 푼 거라고 볼 수 있다 -- 조인을 여러 번 하는 게 빠를 땐 이 방법 -- 메모리 문제가 없을 땐 전에 LEFT 조인으로 테이블 만들었던 방법 SELECT C.company_code, C.founder, (SELECT COUNT(DISTINCT lead_manager_code) -- 2) 리드 매니저의 숫자 출력 부분을 서브쿼리로! - 리드 매니저 테이블에서 리드 매니저 수를 카운팅 FROM lead_manager WHERE company_code = C.company_code) (SELECT COUNT(DISTINCT senior_manager_code) -- 3) 시니어 매니저의 숫자 출력 부분을 서브쿼리로! - 시니어 매니저 테이블에서 리드 매니저 수를 카운팅 FROM senior_manager WHERE company_code = C.company_code) (SELECT COUNT(DISTINCT manager_code) -- 3) 매니저의 숫자 출력 부분을 서브쿼리로! - 매니저 테이블에서 리드 매니저 수를 카운팅 FROM manager WHERE company_code = C.company_code) FROM company C ORDER BY company_code
HackerRank - Occupations : https://www.hackerrank.com/challenges/occupations/problem
SELECT rnk, ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) rnk FROM occupation -- 여기까지 해서 돌려보기 - 직업군으로 넘버링된다 - 파티션바이는 이처럼 일종의 구분을 지어주는 것 - 직업을 구준으로, 이거는 알파벳 -- 이 테이블을 서브쿼리로 사용할 것임 -- 첫 번째 칼럼에는 닥터만 나와야 함 : CASE문으로 가능! SELECT MIN(CASE WHEN occupation = 'Doctor' THEN name END) doctor -- 이거 하나가 칼럼이 됨 MIN(CASE WHEN occupation = 'Professor' THEN name END) professor, MIN(CASE WHEN occupation = 'Singer' THEN name END) singer, MIN(CASE WHEN occupation = 'Actor' THEN name END) actor, FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY occupation ORDER BY name) rnk FROM occupation) A GRUOP BY rnk -- 위에서 만든 row_number() 활용 ORDER BY rnk
HackerRank - Weather Observation Station 5 : https://www.hackerrank.com/challenges/weather-observation-station-5/problem
-- 길이를 세는 함수 length() -- 가장 크고 작은 거 찾는 쉬운 방법 : ORDER BY + LIMIT SELECT city, LENGTH(city) FROM station ORDER BY LENGTH(city), city LIMIT 1;
SELECT city, LENGTH(city) FROM station ORDER BY LENGTH(city) DESC, city LIMIT 1;