SQL을 요즘 안 다뤄서 감을 잡기 위해 이전에 풀었던 SQL을 빠르게 복습할 것이다.
코드
WITH a AS (
SELECT
COUNT(user_id) AS tweet_bucket
FROM tweets
WHERE EXTRACT(YEAR FROM tweet_date) = 2022
GROUP BY user_id
)
SELECT
tweet_bucket
, COUNT(tweet_bucket) AS users_num
FROM a
GROUP BY tweet_bucket
비고 : GROUP BY에 대해 까먹었다. 다시 알게 되어 기쁘다.
WITH a AS(
SELECT
candidate_id
FROM candidates
WHERE skill in ('Python','Tableau','PostgreSQL')
)
SELECT
candidate_id
FROM a
GROUP BY candidate_id
HAVING COUNT(candidate_id)=3
ORDER BY candidate_id
SELECT
candidate_id
FROM candidates
WHERE skill IN ('Python', 'Tableau', 'PostgreSQL')
GROUP BY candidate_id
HAVING COUNT(DISTINCT skill) = 3
ORDER BY candidate_id;
비고 : 위에 코드로 짰는데 이전에 짠 코드가 훨씬 잘 된 거 같다. 위에 코드는 굳이 WITH 절을 할 필요가 없어 보인다.
SELECT
page_id
FROM pages
LEFT JOIN page_likes
USING(page_id)
WHERE user_id IS NULL
SELECT
part
, assembly_step
FROM parts_assembly
WHERE finish_date IS NULL
SELECT
(
SELECT
COUNT(device_type)
FROM viewership
WHERE device_type = 'laptop'
) laptop_views
,
(
SELECT
COUNT(device_type)
FROM viewership
WHERE device_type in ('tablet','phone')
) mobile_views
비고 : SELECT만 사용해도 된다는 것을 알았던 문제.
SELECT
user_id
, EXTRACT(DAY FROM MAX(post_date) - MIN(post_date)) days_between
FROM posts
WHERE EXTRACT(YEAR FROM post_date) = 2021
GROUP BY user_id
HAVING COUNT(user_id) > 1
비고 : EXTRACT 함수 내에 사칙 연산을 할 수 있고 MAX()와 MIN()도 넣을 수 있는 걸 알게 된 문제.
SELECT
sender_id
, COUNT(sender_id) message_count
FROM messages
WHERE
EXTRACT(YEAR FROM sent_date) = 2022
AND EXTRACT(MONTH FROM sent_date) = 8
GROUP BY sender_id
ORDER BY message_count DESC
LIMIT 2