Select584. Find Customer Referee1148. Article Views I1683. Invalid TweetsBasic Joins1378. Replace Employee ID With The Unique Identifier1581. Customer Who Visited but Did Not Make Any Transactions197. Rising Temperature1661. Average Time of Process per Machine1280. Students and Examinations570. Managers with at Least 5 Direct Reports1934. Confirmation RateBasic Aggregations1251. Average Selling Price1193. Monthly Transactions I1174. Immediate Food Delivery II550. Game Play Analysis IV
Select
584. Find Customer Referee
referee_id
๊ฐ 2๊ฐ ์๋ row์ name์ selectํ๋ค.
- ๋ฌธ์ ๋
referee_id
์ null value๋ฅผ ํฌํจํ ๊ฒฝ์ฐ์๋ select์์ ์ ์ธ๋๋ค๋ ์ ์ด๋ค.
- ๋ฐ๋ผ์ null value๋ฅผ ํฌํจํ ์ ์๋ ์กฐ๊ฑด
referee_id IS NULL
์ ์ถ๊ฐํด์ผ ํ๋ค.
SELECT name FROM Customer WHERE referee_id IS NULL or referee_id != 2
1148. Article Views I
author_id
๋ฅผ ๊ธฐ์ค์ผ๋ก unique ํ ๊ฐ๋ง ๊ฐ์ ธ์ค๋ ค๋ฉดDISTINCT
keyword๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ์ถ๋ ฅ๋๋ column์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ค๋ฉด
AS
์ origin_col AS new_col
์ ์ฌ์ฉํ๋ค.
- ํน์ column์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ค๋ฉด
ORDER BY
์ ์ ์ฌ์ฉํ๋ค.
SELECT DISTINCT author_id AS id FROM Views WHERE author_id = viewer_id ORDER BY author_id ASC
1683. Invalid Tweets
- column ๊ฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ค๋ฉด
length
ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT tweet_id FROM Tweets WHERE length(content) > 15
Basic Joins
1378. Replace Employee ID With The Unique Identifier
Employees
table์ ๊ธฐ์ค์ผ๋ก ํ๋ฏ๋กLEFT JOIN
์ ์ฌ์ฉํด์ผ ํ๋ค.
SELECT EmployeeUNI.unique_id, name FROM Employees LEFT JOIN EmployeeUNI ON Employees.id = EmployeeUNI.id
JOIN
์ ๋ํ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ ๋ํ ์ค๋ช ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ค.
1581. Customer Who Visited but Did Not Make Any Transactions
LEFT EXCLUDING JOIN
์ ์ฌ์ฉํด์ผ ํ๋ค.LEFT EXCLUDING JOIN
์LEFT JOIN
์ ์ฌ์ฉํ๋ right table์ ํญ๋ชฉ์ด ์๋ row๋ฅผ ์ ์ธํด์ผ ํ๋ฏ๋กWHERE
์ ๋กRight.key IS NULL
๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
- count๋ฅผ customer_id ๊ธฐ์ค์ผ๋ก ํด์ผํ๋ฏ๋ก
GROUP BY
์ ์ ์ฌ์ฉํ๋ค.
SELECT customer_id, COUNT(Visits.visit_id) AS count_no_trans FROM Visits LEFT JOIN Transactions ON Visits.visit_id = Transactions.visit_id WHERE Transactions.visit_id IS NULL GROUP BY customer_id
197. Rising Temperature
- ์ด์ ๊ฐ์
LAG
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐํ ์ ์๋ค. LAG(column) OVER (ORDER BY order_column)
- ๋ฌธ์ ๋
LAG
ํจ์๋WHERE
์ ์์ ์ธ ์ ์์ผ๋ฏ๋ก sub query๋ฅผ ์์ฑํ์ฌ ์ด์ ๊ฐ์ ์ฐธ์กฐํ๋ column์ ์์ฑํ๋ค. - sub query ์์ฑ ์ ๋ฐ๋์ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค.
SELECT id FROM ( SELECT id, temperature AS currTemp, LAG(temperature) OVER (ORDER BY recordDate) AS prevTemp, DATEDIFF( recordDate, LAG(recordDate) OVER (ORDER BY recordDate) ) AS recordDateDiff FROM Weather ) WeatherWithPrev WHERE currTemp > prevTemp AND recordDateDiff = 1
1661. Average Time of Process per Machine
activity_type
์ผ๋ก ๊ตฌ๋ถ๋๋ ์์, ์ข ๋ฃ row๋ฅผ ๋ฌถ์ด์ ์ฒ๋ฆฌํด์ผ ํ๋ค.LAG OVER
์ ์์PARTITION BY
๋ฅผ ์ฌ์ฉํ์ฌmachine_id
,process_id
๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด์ค ์ ์๋๋ก ํ๋ค.activity_type
์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- ํ๊ท ๊ฐ์ ๊ตฌํ๋ 3์๋ฆฌ๋ง ๋จ๊ธธ ์ ์๋๋ก
ROUND
ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT machine_id, ROUND(AVG(end_time - start_time), 3) as processing_time FROM ( SELECT machine_id, process_id, LAG(timestamp) OVER ( PARTITION BY machine_id, process_id ORDER BY activity_type ) AS start_time, timestamp AS end_time FROM Activity ) ActivityPair GROUP BY machine_id
1280. Students and Examinations
- ํด๋ต์ ๋์์ ๋ฐ์๋ ๋ฌธ์ . ๋ค์ผ๋ก
JOIN
ํ ๋ ํ ์ด๋ธ ์ด๋ฆ์ ์ถ์ฝํ๋ ๋ฐฉ๋ฒ์ ์ข ๋ฐฐ์ ๋ค.
- ์ฌ๋ฌ ํ
์ด๋ธ์
JOIN
ํ ๋๋ ๊ธฐ์ค์ ์ ์ก๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์ ์๋ค.
- ์๋์ ๊ฐ์ ์์๋ก ์ ๊ทผํ๋ฉด ์ฝ๊ฒ ์ดํด๋ ์ ์๋ค.
- ๋จผ์ ์ด ๋ฌธ์ ๋ ๊ฐ ํ์
Students
x ๊ณผ๋ชฉSubjects
์ ์กฐํฉ์ ๊ธฐ์ค์ผ๋ก ์ฐธ์ฌํ ์ํ์ ์ซ์๋ฅผ ์ํ ๊ธฐ๋กExaminations
์์ ์ธ์ด์ผ ํ๋ ๋ฌธ์ ์ด๋ค. - ๋ฐ๋ผ์ ๊ธฐ์ค์
Students
์Subjects
์กฐํฉ์ด ๋์ด์ผ ํ๋ค. ์ด๋ฅผ ๊ตฌํ๋ ค๋ฉดCROSS JOIN
์ ์ฌ์ฉํ์ฌ ๋ ํ ์ด๋ธ์ row์ ์กฐํฉ์ ์์ฑํด์ผ ํ๋ค. - ์ด์ ์ด๋ ๊ฒ ๊ธฐ์ค์ ์ด ์กํ๋ค๋ฉด ์ํ ๊ธฐ๋ก
Examinations
์LEFT JOIN
ํ์ฌ ๊ธฐ์ค์ ์ ๋ฐ๋ผ counting์ ํ ์ ์๋๋ก ํ๋ค. student_id
,subject_name
๋ง๋ค counting ํ ์ ์๋๋กGROUP BY
๋ฅผ ์ ์ฉํ๋ค.- ์ ๋ ฌ์ด ํ์ํ๋ฏ๋ก
ORDER BY
๋ฅผ ์ ์ฉํ๋ค.
SELECT S.student_id, S.student_name, SUB.subject_name, COUNT(E.subject_name) AS attended_exams FROM Students S CROSS JOIN Subjects SUB LEFT JOIN Examinations E ON ( S.student_id = E.student_id AND SUB.subject_name = E.subject_name ) GROUP BY S.student_id, SUB.subject_name ORDER BY S.student_id, SUB.subject_name
570. Managers with at Least 5 Direct Reports
- ๋จผ์ managerId๋ฅผ ๊ธฐ์ค์ผ๋ก report ์ซ์ (row ์ซ์)๋ฅผ ์ผ๋ค.
- ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋ก manager์ ์ด๋ฆ
name
์JOIN
ํ์ฌ ๊ฐ์ ธ์จ๋ค.
- ์ ์ฒด ๊ฒฐ๊ณผ์์ report ์ซ์, ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ค (
WHERE
์ ).
SELECT B.name FROM ( SELECT managerId, COUNT(managerId) as report FROM Employee GROUP BY managerId ) E LEFT JOIN Employee B ON E.managerId = B.id WHERE E.report >= 5 AND B.name IS NOT NULL
1934. Confirmation Rate
- ์ฌ์ฉ์ ID
user_id
๋ฅผ ๊ธฐ์ค์ผ๋ก confirmation rate๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋กSignups
table์ด ๊ธฐ์ค์ด ๋์ด์ผ ํ๋ค.
- Confirmation rate๋ฅผ ๊ตฌํ๋ ค๋ฉด ์ ์ฒด action ์ซ์์
confirmed
๋ action ์ซ์๋ฅผ ๋ฐ๋ก ๊ตฌํด์ผ ํ๋ค. CASE
๋ฌธ์ ์ฌ์ฉํ์ฌaction
column ๊ฐ์ดconfirmed
์ธ ๊ฒ๋ง ๊ฐ์1
, ๋๋จธ์ง๋NULL
๋ก ํ์ฌCOUNT
์์action = confirmed
์ธ ๊ฒ๋ง ์ ์ ์๋๋ก ํ๋ค.
- ์ด๋ ๊ฒ ๊ตฌํ ์ซ์๋ฅผ user_id ๊ธฐ์ค์ผ๋ก
JOIN
ํ๋ค.
- Confirmation rate๋ฅผ ๊ณ์ฐํ๋ ๊ฐ์ด
NULL
์ธ ๊ฒฝ์ฐ0
์ ๋๋ ค์ค ์ ์๋๋กCOALESCE
ํจ์๋ฅผ ์ฌ์ฉํ๋ค. COALESCE
ํจ์๋ ์ธ์๋ก ๋ค์ด์จ ๊ฐ ์คNULL
์ด ์๋ ์ฒซ๋ฒ์งธ ๊ฐ์ ๋๋ ค์ค๋ค.
- ์์์ 2์๋ฆฌ๋ก ์ฌ๋ฆผํ์ฌ ๊ตฌํด์ผ ํ๋ฏ๋ก
ROUND
ํจ์๋ฅผ ์ด์ฉํ๋ค.
# Write your MySQL query statement below SELECT S.user_id, ROUND(COALESCE(C.count / C.total, 0), 2) as confirmation_rate FROM Signups S LEFT JOIN ( SELECT user_id, COUNT(CASE action WHEN 'confirmed' THEN 1 ELSE NULL END) as count, COUNT(*) as total FROM Confirmations GROUP BY user_id ) C ON S.user_id = C.user_id
Basic Aggregations
1251. Average Selling Price
Prices
์ ๊ธฐ์ฌ๋ ์ ํ IDproduct_id
๊ฐ ๊ธฐ์ค์ด ๋์ด์ผ ํ๋ค.
- ํ๋งค๋ ์ ํ ๊ธฐ๋ก
UnitsSold
๊ณผ ์ ํ IDproduct_id
๋ฟ ์๋๋ผ ๊ธฐ๊ฐstart_date
,end_date
,purchase_date
๋ ๋ง์์ผ ํ๋ฏ๋ก ํด๋น ์กฐ๊ฑด์ ๋ชจ๋ ํฌํจํ์ฌJOIN
ํ๋ค.
- ๊ฐ์ด
NULL
์ธ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํดCOALESCE
ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT P.product_id, ROUND(COALESCE(SUM(U.units * P.price) / SUM(U.units), 0), 2) as average_price FROM Prices P LEFT JOIN UnitsSold U ON U.product_id = P.product_id AND U.purchase_date >= P.start_date AND U.purchase_date <= P.end_date GROUP BY P.product_id
1193. Monthly Transactions I
- ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฑฐ๋์ ์ซ์, ๊ฑฐ๋๋์ ๊ตฌํ๋ ๋ฌธ์ .
- ๋ ์ฝ๋์ ์ซ์๋ฅผ ์
๋๋
CASE
๋ฌธ์ ์ฐ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ ์๋ฌด ๊ฐ (์:1
) ์๋๋๋NULL
์ด ๋๋๋ก ํ๋ค (ELSE
์๋ต).
- ๋ ์ฝ๋ ๊ฐ์ ํฉํ ๋๋
CASE
๋ฌธ์ ์ฐ๋ํ๋ ELSE 0
๋ก ์กฐ๊ฑด์ ๋ช ์ํด์ผ ํ๋ค. - ๊ทธ๋ ์ง ์์ผ๋ฉด ์กฐ๊ฑด์ ํด๋น๋๋ ๋ ์ฝ๋๊ฐ ํ๋๋ ์์ ๊ฒฝ์ฐ ๊ฐ์ด
NULL
์ด ๋๋ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. COALESCE
๋ฅผ ์กฐํฉํ ์๋ ์๊ฒ ์ง๋ง ์ง๊ด์ ์ด์ง๋ ์๋ค.
SELECT DATE_FORMAT(T.trans_date, '%Y-%m') as month, T.country, COUNT(*) AS trans_count, COUNT(CASE WHEN T.state = "approved" THEN 1 END) AS approved_count, SUM(T.amount) AS trans_total_amount, SUM(CASE WHEN T.state = "approved" THEN T.amount ELSE 0 END) AS approved_total_amount FROM Transactions AS T GROUP BY month, T.country
1174. Immediate Food Delivery II
- ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ๊ณจ๋ผ์ ๊ฐ์ ์์ฝํด์ผ ํ๋ค.
- ๋จผ์ ์ฌ๊ธฐ์๋ ๊ณ ๊ฐ๋ณ ์ฒซ๋ฒ์งธ ์ฃผ๋ฌธ์ ๊ณจ๋ผ๋ด์ผ ํ๋ฏ๋ก
customer_id
๋ก ๊ทธ๋ฃนํ๋order_date
์ ์ต์๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ์ป์ด์ง ๊ฒฐ๊ณผ๋ฅผ
customer_id
,order_date
๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ ํ ์ด๋ธ๊ณผINNER JOIN
ํ์ฌ ๋๋จธ์ง ์ฐ์ฐ์ ์ํํ๋ฉด ๋๋ค.
SELECT ROUND( COUNT( CASE WHEN order_date = customer_pref_delivery_date THEN 1 END ) * 100 / COUNT(*), 2 ) AS immediate_percentage FROM Delivery AS D JOIN ( SELECT customer_id, MIN(order_date) AS first_date FROM Delivery GROUP BY customer_id ) F ON D.customer_id = F.customer_id AND D.order_date = F.first_date
WHERE IN
์ ์ ์ฌ์ฉํ์ฌ ์์ ๋ด์ฉ์ ์ข ๋ ์ถ์ฝํด์ ํํ ๊ฐ๋ฅํ๋ค.WHERE (์ผ์นํด์ผ๋ column ๋ชฉ๋ก) IN (์๋ธ ์ฟผ๋ฆฌ)
SELECT ROUND( COUNT( CASE WHEN order_date = customer_pref_delivery_date THEN 1 END ) * 100 / COUNT(*), 2 ) AS immediate_percentage FROM Delivery AS D WHERE (customer_id, order_date) IN ( SELECT customer_id, MIN(order_date) AS order_date FROM Delivery GROUP BY customer_id )
550. Game Play Analysis IV
- ๋ฌธ์ ์ ์กฐ๊ฑด(์ฒซ๋ฒ์งธ ๋ก๊ทธ์ธ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ์ 2์ผ ๋ก๊ทธ์ธํ ํ๋ ์ด์ด)์ ์ ๋๋ก ํ์ธํ ํ์๊ฐ ์๋ค.
- ๊ฐ ํ๋ ์ด์ด ๋ณ ์ฒซ๋ฒ์งธ ๋ก๊ทธ์ธ ๋ ์ง๋ฅผ ๊ตฌํ๊ณ
player_id
๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ ํ ์ด๋ธ๊ณผINNER JOIN
ํ๋ค.
- ์ ์ฒด ํ๋ ์ด์ด์ ์, ๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ ์ด์ด์ ์๋ฅผ ์ผ๋ค.
- ๋ฌธ์ ๋ ๋์ผํ
player_id
๋ฅผ ๊ฐ์ง ๋ ์ฝ๋๊ฐ ์ฌ๋ฌ๊ฐ ์กด์ฌํ๋ฏ๋กDISTINCT
๋ฌธ์ ์ฌ์ฉํ์ฌ uniqueํ ํ๋ ์ด์ด์ ์๋ฅผ ์ธ์ผ ํ๋ค.
COUNT
+CASE
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์์ชฝ์DISTINCT
๋ฅผ ๋ถ์ฌ์ unique ํ ๊ฐ์ ์ ์ ์๋ค.CASE
๋ฌธ ๋ด๋ถ์DISTINCT
๋ฅผ ๋ถ์ด๋ฉด ์ ๋๋ก ์ฒดํฌ๊ฐ ์๋๋ค. ๋ฐ๋์ ๊ฐ์ฅ ์์ ๋ถ์ฌ์ผ ํ๋ค.
SELECT ROUND( COUNT( DISTINCT CASE WHEN DATEDIFF(A.event_date, F.first_date) = 1 THEN A.player_id END ) / COUNT(DISTINCT A.player_id), 2 ) as fraction FROM Activity AS A JOIN ( SELECT player_id, MIN(event_date) AS first_date FROM Activity GROUP BY player_id ) F ON A.player_id = F.player_id
ย