On the journey of

[SolveSQL] 멘토링 짝꿍 리스트, 작품이 없는 작가 찾기 본문

코딩테스트/SQL

[SolveSQL] 멘토링 짝꿍 리스트, 작품이 없는 작가 찾기

dlrpskdi 2023. 6. 20. 19:43

1. 멘토링 짝꿍 리스트 - https://solvesql.com/problems/mentor-mentee-list/

 

solvesql

 

solvesql.com

Q. employees 테이블에는 어느 회사의 직원 정보가 들어있습니다. 각각의 데이터는 직원 ID, 직원의 이름, 입사일, 부서, 직속 상사의 ID로 구성되어있습니다.

회사에서 신규 입사자들의 빠른 적응을 돕기 위해 멘토링 프로그램을 운영하려고 합니다. 멘티가 될 신규 입사자들은 ‘2021년 12월 31일’을 기준으로 3개월 이내 입사한 인원 전체이며, 멘토는 ‘2021년 12월 31일’을 기준으로 재직한지 2년 이상이 된 직원들만 배정하려고 합니다. 또한 최대한 다양한 분야의 직원들이 서로 교류 할 수 있도록 서로 다른 부서에 속하는 직원끼리 멘토링을 진행하려고 합니다.

위 조건을 모두 만족하는 멘티-멘토 짝꿍 리스트를 계산하는 쿼리를 작성해주세요. 쿼리 결과에는 매칭 가능한 멘토가 없는 경우도 모두 포함되어야 합니다. 추가로 쿼리 결과는 멘티 ID를 기준으로 오름차순 정렬되어 있어야 하고, 멘티 1명에 대해 배정 가능한 멘토가 여러 명인 경우 멘토 ID로 오름차순 정렬되어 있어야 합니다.

  • mentee_id - 멘티 ID
  • mentee_name - 멘티 이름
  • mentor_id - 멘토 ID
  • mentor_name - 멘토 이름

A. cross join을 통해 멘티-멘토 간 리스트를 이어주는 과정이 필요하다. 때문에 조금 번거롭지만. SELECT - AS 구문을 통해 ~mentee id와 mentor id, 각 이름을 모두 구분, 명시해 줬다 :)

SELECT
  A.employee_id AS mentee_id,
  A.name AS mentee_name,
  B.employee_id AS mentor_id,
  B.name AS mentor_name
FROM
  employees A
  CROSS join employees B
WHERE
  A.join_date BETWEEN '2021-09-01' and '2021-12-31'
  AND B.join_date <= '2019.12.31'
  AND A.department != B.department
ORDER BY
  mentee_id,
  mentor_id

결과적으로 총 45개 행 출력됨 :)

2. 작품이 없는 작가 찾기 - https://solvesql.com/problems/artists-without-artworks/

 

solvesql

 

solvesql.com

Q. Museum of Modern Art Collection 데이터셋은 미국 뉴욕의 근현대 미술관인 MoMA의 작품과 작가 정보를 담고 있습니다. artists 테이블에는 MoMA에 등록된 작가들의 정보가 있고, artworks_artists 테이블에는 각 작품에 참여한 작가들의 정보가 들어있습니다. 하나의 작품에 여러 명의 작가가 참여할 수 있기 때문에, artworks_artists 테이블의 artwork_id 컬럼과 artist_id 컬럼은 N:M 관계입니다.

MoMA에 등록된 작가이지만 전시된 작품이 없는 작가들의 마지막 작품을 전시하는 기획전을 준비하려 합니다. MoMA에 등록되어있고, 현재 살아있지 않은 작가 중 MoMA에 등록된 작품이 없는 작가의 ID와 이름을 출력하는 쿼리를 작성해주세요. 쿼리 결과에는 아래 컬럼이 있어야 합니다.

  • artist_id - 작가 ID
  • name - 작가 이름 

A. 그러니깡 살아있지 않은 작가에서 1차 필터링, 그 다음 등록된 작품이 없다(null)는 것으로 2차 필터링을 진행한 다음 출력물도 ID와 이름만 나오게끔 변수를 설정해 줘야 한다. 그러면 순서대로 구문을 짜보자. 

SELECT o1.artist_id
     , o1.name
FROM artists AS o1
LEFT JOIN artworks_artists AS o2 ON o2.artist_id = o1.artist_id
WHERE death_year is not null AND artwork_id is null

출력 결과 생각보다 많은 분들이 계셨다.

주제가 너무 다양해서(신선해서?) 어느 구문에 어떤 조건을 넣어야 할지 헷갈리게 만든 게 solvesql의 단점이자 장점인 듯,,