KATA#85

codataffee·2024년 7월 8일
1

CODEKATA

목록 보기
85/114
post-thumbnail

WHAT IS KATA?

KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.

이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.


- SQL


✔️ 문제 #1: 15 Days of Learning SQL

Hackers Table :Submissions Table :

문제
SQL 학습을 위한 15일 간의 콘테스트 진행, 2016년 3월 1일 ~ 2016년 3월 15일의 기간 중
각 날짜마다 최소 한 번의 제출을 한 고유 해커 수를 계산하고, 각 날짜마다 가장 많은 제출을 한 해커의 ID와 이름을 조회하는 쿼리 작성하기.
여러 해커가 동일한 최대 제출 수를 가진다면, ID가 가장 낮은 해커 순으로 정렬

이 사이트.. MySQL 8.0 미만 버전 이슈로,
WINDOW 함수도 사용이 안되고,
WITH 구문 사용도 안되는 것이 너무.. 킹받는다ㅋㅋ

✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT 
    s1.submission_date,
    # 각 날짜에 최소 하나의 제출을 한 고유 해커 수 계산
    (SELECT COUNT(DISTINCT s2.hacker_id)
     FROM submissions s2
     WHERE s2.submission_date = s1.submission_date
       AND (SELECT COUNT(DISTINCT s3.submission_date)
            FROM submissions s3
            WHERE s3.hacker_id = s2.hacker_id
              AND s3.submission_date < s1.submission_date
           ) = DATEDIFF(s1.submission_date, '2016-03-01')
    ) cnt,
    # 각 날짜에 가장 많은 제출을 한 해커의 ID 찾기
    (SELECT s2.hacker_id
     FROM submissions s2
     WHERE s2.submission_date = s1.submission_date
     GROUP BY s2.hacker_id
     ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
     LIMIT 1
    ) top_id,
    # 가장 많은 제출을 한 해커의 이름 찾기
    (SELECT h.name
     FROM hackers h
     WHERE h.hacker_id = (SELECT s2.hacker_id
                          FROM submissions s2
                          WHERE s2.submission_date = s1.submission_date
                          GROUP BY s2.hacker_id
                          ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
                          LIMIT 1)
    ) top_name
FROM (SELECT DISTINCT submission_date
      FROM submissions) s1
ORDER BY s1.submission_date;


✔️ CHECK POINT

  • SQL
    • 중첩 서브쿼리 활용
1. 서브 쿼리
    # 각 날짜에 최소 하나의 제출을 한 고유 해커 수 계산
    (SELECT COUNT(DISTINCT s2.hacker_id)
     FROM submissions s2
     WHERE s2.submission_date = s1.submission_date
       AND (SELECT COUNT(DISTINCT s3.submission_date)
            FROM submissions s3
            WHERE s3.hacker_id = s2.hacker_id
              AND s3.submission_date < s1.submission_date
           ) = DATEDIFF(s1.submission_date, '2016-03-01')
    ) cnt,

    # 각 날짜에 가장 많은 제출을 한 해커의 ID 찾기
    (SELECT s2.hacker_id
     FROM submissions s2
     WHERE s2.submission_date = s1.submission_date
     GROUP BY s2.hacker_id
     ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
     LIMIT 1
    ) top_id,

    # 가장 많은 제출을 한 해커의 이름 찾기
    (SELECT h.name
     FROM hackers h
     WHERE h.hacker_id = (SELECT s2.hacker_id
                          FROM submissions s2
                          WHERE s2.submission_date = s1.submission_date
                          GROUP BY s2.hacker_id
                          ORDER BY COUNT(s2.submission_id) DESC, s2.hacker_id
                          LIMIT 1)
    ) top_name

2. 데이터 그룹화 및 정렬
    FROM (SELECT DISTINCT submission_date
          FROM submissions) s1
    ORDER BY s1.submission_date;

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보