241108_TIL

J Lee·2024년 11월 8일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크

SELECT COUNT(DISTINCT customer_id) AS "rich_count"
FROM   (SELECT customer_id
        FROM   Store
        WHERE  amount > 500) result;

문제 링크
1트(7/31)에서는 union을 썼는데
오늘은 join으로 해결했다.

order_type이 2개(0,1)인 경우에는 0만을 출력해야 하므로
해당하는 customer_id만 뽑아서 인라인뷰 a에 저장한 다음,
customer_id와 order_type = 1 기준으로 left join한다.
그런 다음 a.customer_id가 null인 경우만 찾으면 끝.

SELECT o.order_id,
       o.customer_id,
       o.order_type
FROM   Orders o
       LEFT JOIN (SELECT customer_id
                  FROM   Orders
                  GROUP  BY 1
                  HAVING COUNT(DISTINCT order_type) = 2) a
              ON o.customer_id = a.customer_id
                 AND order_type = 1
WHERE  a.customer_id IS NULL;

문제 링크
1트(7/29)에서는 window 함수를 써서 풀었구나.
오늘은 ranking을 쓰는 대신 where절 내에 서브쿼리를 한 번 더 써서
max(total_count)와 같은 total_count를 갖는 airport_id를 찾는 방식을 썼다.

union이 들어있기 때문에
서브쿼리로 처리하는 것보다는 cte를 쓰는 게 알아보기 편할 것 같아서
cte를 쓰는 것은 동일하게 했다.

WITH RESULT
     AS (SELECT airport_id,
                Sum(flights_count) AS "total_count"
         FROM   (SELECT departure_airport AS "airport_id",
                        flights_count
                 FROM   Flights
                 UNION ALL
                 SELECT arrival_airport,
                        flights_count
                 FROM   Flights) a
         GROUP  BY 1)
SELECT airport_id
FROM   RESULT
WHERE  total_count = (SELECT Max(total_count)
                      FROM   RESULT);

프로그래머스

문제 링크

SELECT ANIMAL_ID,
       NAME,
       SEX_UPON_INTAKE
FROM   ANIMAL_INS
WHERE  name IN ( 'Lucy', 'Ella', 'Pickle', 'Rogan',
                 'Sabrina', 'Mitty' )
ORDER  BY 1;

문제 링크
where절에 and와 or 조건을 넣을 때
논리연산자가 어떻게 작동하는지 주의해서 보고 넣을 것.

and는 앞뒤로 동시에 참이어야 하고
or는 앞뒤 중 하나만 참이어도 됨.
괄호로 잘 묶어줘야 꼬이지 않음.

SELECT i.ANIMAL_ID,
       i.ANIMAL_TYPE,
       i.NAME
FROM   ANIMAL_INS i
       JOIN ANIMAL_OUTS o
         ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE  i.SEX_UPON_INTAKE LIKE ( '%Intact%' )
       AND ( o.SEX_UPON_OUTCOME LIKE '%Spayed%'
              OR o.SEX_UPON_OUTCOME LIKE '%Neutered%' )
ORDER  BY 1;

문제 링크
where 절로 조건을 걸고
order by로 정렬까지 마친 다음 limit를 써서 출력 결과를 제한하면 된다.

SELECT i.NAME,
       i.DATETIME
FROM   ANIMAL_INS i
       LEFT JOIN ANIMAL_OUTS o
              ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE  o.DATETIME IS NULL
ORDER  BY DATEDIFF(o.DATETIME, i.DATETIME) DESC,
          2 ASC
LIMIT  3;

문제 링크
where절까지 굳이 쓸 필요없이
join 조건으로 넣으면 됨.

SELECT i.ANIMAL_id,
       i.NAME
FROM   ANIMAL_INS i
       JOIN ANIMAL_OUTS o
         ON i.ANIMAL_ID = o.ANIMAL_ID
            AND o.DATETIME < i.DATETIME
ORDER  BY i.DATETIME ASC;

문제 링크
간단한 join 문제.

SELECT o.ANIMAL_ID,
       o.NAME
FROM   ANIMAL_OUTS o
       LEFT JOIN ANIMAL_INS i
              ON o.ANIMAL_ID = i.ANIMAL_ID
WHERE  i.DATETIME IS NULL
ORDER  BY 1;

이걸로 프로그래머스는 끝.
3트를 돌지는 않을 것 같다.
시간을 들이는 것 대비 효율이 별로인 듯해서 leetcode 3트까지만 집중하기로.

profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보