TIL💡/Database(27)
-
[LeetCode] 262. Trips and Users
Hard 문제라 그런지 푸는 데 한참 더 걸렸다..ㅠ 그리고 예상치 못한 변수들이 자주 등장했다. Common Table Expressions(CTE)를 만들어서 banned되지 않은 user만 추출해놓는다. 이를 이용해 client_id, driver_id가 banned되지 않은 유저에 해당하는 row만 추출하려고 했다. 그런데 동일한 CTE를 이용하면 안되고 각각 다른 유저 테이블로 속함 여부를 판단해야한다. 안그러면 제대로 작동하지 않는다. (아무래도 하나의 테이블에서 하나의 row를 내부적으로 가리켜야하는 거 같다.) 그리고 날짜 구간을 위해 리트코드에서는 처음으로 BETWEEN을 써주어서 풀 수 있었다. WITH NOT_BANNED_USERS AS ( SELECT users_id FROM Use..
2022.12.08 -
[LeetCode] 550. Game Play Analysis IV
이번 문제도 튜플을 생성해서 풀면 간단한 문제이다. 그런데 GROUP BY를 안 쓰고 그냥 MIN으로 구했더니 리트코드가 터져버리더라...;; 다시 한 번 SQL 쿼리에도 효율성이 큰 문제임을 깨달으면서 이번 문제를 풀어나갔다. 크게 Activity 테이블을 3번 쓴다. 한 번은 데이터를 크게 추출하는 베이스 테이블로, 다른 하나는 플레이어별 최초 접속 일자 추출용, 나머지 하나는 전체 플레이어 수를 추출하는 데 사용된다. 복잡해보여도 하나하나 블록 쌓듯이 쿼리를 조합해나가면 어렵지 않게 풀 수 있다. 그리고 여기서 이전 날을 구할 때 DATE_SUB 함수를 INTERVAL과 함께 쓰는 것을 기억해두자. SELECT ROUND( COUNT(A1.player_id) / (SELECT COUNT(DISTIN..
2022.12.07 -
[LeetCode] 534. Game Play Analysis III
난이도 상승하는 게 느껴진다. 이는 player_id별로 누적합을 구하려 하니, subquery로 2중 루프 같이 각 누적합을 구하려 하니 TLE(Time Limit Exceeded)하게 되었다. SELECT A1.player_id, A1.event_date, ( SELECT SUM(A2.games_played) FROM Activity A2 WHERE A2.player_id = A1.player_id AND A2.event_date
2022.11.27 -
[LeetCode] 511. Game Play Analysis I
https://leetcode.com/problems/game-play-analysis-i/ Game Play Analysis I - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com GROUP BY를 활용하면 간단한 문제인데, 셀프조인으로 빙빙 돌려서 조건문 처리할 생각을 하던 나 자신.. 반성해..! Intuition Group rows into subgroups specific to each player with GROUP BY and then extract ..
2022.11.27 -
[LeetCode] 181. Employees Earning More Than Their Managers
https://leetcode.com/problems/calculate-special-bonus/?envType=study-plan&id=sql-i Calculate Special Bonus - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 어차피 Manager도 Employee의 일부로 이것도 셀프 조인 문제로, 굉장히 많이 보였던 유형이다. SELECT e1.name AS Employee FROM Employee e1 JOIN Employee e2 ON e1..
2022.11.27 -
[LeetCode] 177. Nth Highest Salary
이 문제는 기본적으로 함수 템플릿이 있다. 이번 기회에 함수를 익히는 것도 좋은 일인 것 같다. CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN SET N = N - 1; RETURN ( # Write your MySQL query statement below. SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET N ); END 만약 변수를 사용하고 싶다면 SET을 사용한다. 그리고 함수는 BEGIN, END로 감싼다.
2022.11.27