241103_TIL

J Lee·2024년 11월 3일
0

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

SQL 문제풀이 복습


Leetcode

문제 링크
먼저 user1과 user2의 공통 follower 수를 구한 다음
그 값이 최대인 조합만 뽑아오는 문제.

서브쿼리로 처리해도 되고
cte로 처리해도 상관없음.

아예 join을 할 때 user_id끼리의 대소 조건을 넣으면
굳이 least/greatest 안 써도 되겠구나 하는 생각도 든다.

WITH result
     AS (SELECT r1.user_id AS "user1_id",
                r2.user_id AS "user2_id",
                Count(*)   AS "cnt"
         FROM   Relations r1
                JOIN Relations r2
                  ON r1.user_id <> r2.user_id
                     AND r1.follower_id = r2.follower_id
         GROUP  BY 1,
                   2)
SELECT LEAST(user1_id, user2_id)    AS "user1_id",
       GREATEST(user1_id, user2_id) AS "user2_id"
FROM   result
WHERE  cnt = (SELECT Max(cnt)
              FROM   result)
GROUP  BY 1,
          2;

문제 링크

SELECT e.employee_id
FROM   Employees e
       LEFT JOIN Salaries s
              ON e.employee_id = s.employee_id
WHERE  s.employee_id IS NULL
UNION
SELECT s.employee_id
FROM   Salaries s
       LEFT JOIN Employees e
              ON s.employee_id = e.employee_id
WHERE  e.employee_id IS NULL
ORDER  BY 1;

문제 링크

SELECT w2.id
FROM   Weather w1
       JOIN Weather w2
         ON DATEDIFF(w2.recordDate, w1.recordDate) = 1
            AND w2.temperature - w1.temperature > 0;

프로그래머스

문제 링크
Milk와 Yogurt가 동시에 포함된 장바구니 ID를 구하는 문제.
장바구니 ID로 그루핑하되,
서로 다른 품목명(NAME)이 2개 이상인 경우를 골라야 한다.
저 조건이 없으면 Milk만 들어간
서로 다른 장바구니 2개가 선택될 수도 있기 때문.

SELECT CART_ID
FROM   CART_PRODUCTS
WHERE  NAME IN ( 'Milk', 'Yogurt' )
GROUP  BY 1
HAVING COUNT(DISTINCT NAME) >= 2
ORDER  BY 1;

문제 링크

SELECT MAX(DATETIME) AS "시간"
FROM   ANIMAL_INS;

문제 링크

SELECT ANIMAL_ID,
       NAME,
       DATE_FORMAT(DATETIME, '%Y-%m-%d')
FROM   ANIMAL_INS
ORDER  BY 1;

문제 링크
recursive cte를 쓰는 문제.
ANIMAL_OUTS 테이블이 어떻게 생겼는지 예시를 안 주고
쳐 봐야 알 수 있게 만든 점은 매우 별로.

WITH recursive cte
AS
  (
         SELECT 0 AS "HOUR"
         UNION ALL
         SELECT HOUR+1
         FROM   cte
         WHERE  HOUR < 23)
  SELECT    cte.HOUR,
            COUNT(a.ANIMAL_ID) AS "COUNT"
  FROM      cte
  LEFT JOIN ANIMAL_OUTS a
  ON        cte.HOUR = date_format(a.DATETIME,'%H')
  GROUP BY  1;

문제 링크

SELECT DATE_FORMAT(DATETIME, '%H') AS "HOUR",
       COUNT(ANIMAL_ID)            AS "COUNT"
FROM   ANIMAL_OUTS
WHERE  DATE_FORMAT(DATETIME, '%H') BETWEEN 09 AND 19
GROUP  BY 1
ORDER  BY 1;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보