KATA#45

codataffee·2024년 5월 27일
0

CODEKATA

목록 보기
45/114
post-thumbnail

WHAT IS KATA?

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

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


- SQL


✔️ 문제 #1: Restaurant Growth

토요일에 풀다가 결국 풀지 못한 문제...
튜터님께 질문 후 통과했다!

✔️ 제출 쿼리

✔️ 쿼리 분석

WITH movingsum AS (
SELECT DISTINCT visited_on,
       CASE WHEN 
       7 = COUNT(*) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)  
       THEN SUM(amount) OVER 
       (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
       ELSE NULL END amount
FROM Customer
GROUP BY visited_on
)

SELECT visited_on,
       amount,
       ROUND(amount / 7, 2) average_amount
FROM movingsum
WHERE amount IS NOT NULL
  • 튜터님 찾아가기...

✔️ 제출 쿼리

✔️ 쿼리 분석

WITH CTE AS(
    SELECT  DISTINCT visited_on
          , SUM(amount) OVER(PARTITION BY visited_on ORDER BY visited_on) AS am
    FROM customer
)

SELECT visited_on
      ,amount
      ,ROUND(average_amount,2) AS average_amount
FROM (
        SELECT visited_on
            ,SUM(am) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS amount
            ,AVG(SUM(am)) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS average_amount
            ,COUNT(*) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS cnt
        FROM CTE
        GROUP BY visited_on
)l
WHERE cnt = 7
ORDER BY visited_on

업로드중..


✔️ 문제 #2: Investments in 2016

문제 이해하다가.. 진짜 30분은 날린 듯ㅋㅋ...

보험 테이블에서 tiv_2015 값이 1개 이상 중복되면서,
위치(lat-위도,lon-경도)가 겹치지 않는 tiv_2016 값들을 더해
소수점 2째자리까지 반올림

✔️ 제출 쿼리

✔️ 쿼리 분석

SELECT ROUND(SUM(tiv_2016), 2) tiv_2016
FROM Insurance
WHERE tiv_2015 IN (
    SELECT tiv_2015
    FROM Insurance
    GROUP BY tiv_2015
    HAVING COUNT(*) > 1
)
AND (lat, lon) IN (
    SELECT lat, lon
    FROM Insurance
    GROUP BY lat, lon
    HAVING COUNT(*) = 1
)


✔️ 문제 #3: Department Top Three Salaries

리트코드 첫 Hard 문제!

✔️ 제출 쿼리

✔️ 쿼리 분석

# 중복 순위까지 허용해서 부서별 월급 3위까지 조회하는 문제,
# 중복 순위 허용 = DENSE_RANK()
# 순위를 조회하는 ranking 테이블 생성 후, 3위까지만 조회!
WITH ranking AS (
    SELECT *,
       DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) depart
FROM Employee
)

SELECT d.name Department,
       r.name Employee,
       r.salary Salary
FROM ranking r LEFT JOIN Department d
     ON r.departmentId = d.id
WHERE r.depart <= 3


✔️ CHECK POINT

  • SQL
    • SQL에서 시간을 너무 많이 잡아먹어서.. 오늘 파이썬은 패쓰!
    • 이동평균 구하는 문제.. 드디어 해결! 정확한 이유는 아직 이해가 안됐으나,
      PARTITION BY 를 사용하지 않아서 중복 날짜의 값을 불러오지 못한 것 같다.
      튜터님이 알려준대로 작성하여 실행하니 통과!

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

0개의 댓글

관련 채용 정보