본문 바로가기

TIL

[240129] SQL: 코드카타 116 & 파이썬: 코드카타 25~26

[SQL 코드카타]

1321. Restaurant Growth

https://leetcode.com/problems/restaurant-growth/

 

1) 어떤 문제가 있었나

레스토랑의 현재 일자 + 이전 6일간의 총 매출과 매출 평균을 구하는 문제로 

sum, avg 윈도우 함수 내 moving average로 간단하게 값을 구하려고 했으나 실패  

> 현재 총 7일 누적된 값을 내야 하는데, 첫 날짜부터 마지막 날짜까지 쭉 추출됨   

 

2) 내가 시도해본 건 무엇인가

윈도우 함수 활용한 쿼리를 form 절 서브쿼리로 넣고, where로 날짜 조건을 걸었으나 값이 2개인 날짜의 합계 값이 누락됨

#오답 
select visited_on, amount, average_amount
from 
        (SELECT visited_on, 
            sum(amount) OVER (order by visited_on rows between 6 preceding and current row) amount,
            round(avg(amount) OVER (order by visited_on rows between 6 preceding and current row),2) average_amount
        FROM Customer
        group by visited_on) a 
where datediff(visited_on, (select min(visited_on) from Customer) ) > 5 #날짜 조건 추가

 

3) 어떻게 해결했나

with amount_by_day as (select visited_on,            #with절로 날짜별 합계값 구하기
                                sum(amount) sum_amount
                        FROM Customer
                        group by visited_on )

select visited_on, amount, average_amount
from 
        (SELECT visited_on, 
            sum(sum_amount) OVER (order by visited_on rows between 6 preceding and current row) amount,
            round(avg(sum_amount) OVER (order by visited_on rows between 6 preceding and current row),2) average_amount
        FROM amount_by_day
        group by visited_on) a 
where datediff(visited_on, (select min(visited_on) from Customer) ) > 5


4) 무엇을 새롭게 알았나

그 외에 self 조인을 활용한 방법이 있었고, where > group by having 절로 조건을 2번 적용해서 문제 해결.

다만 하기 풀이는 cross join을 해야 해서 작동 시간이 조금 걸리는 듯함  

#다른 사람 풀이 
SELECT a.visited_on AS visited_on, 
	   SUM(b.day_sum) AS amount,
       ROUND(AVG(b.day_sum), 2) AS average_amount
FROM     #self 조인 
  (SELECT visited_on, SUM(amount) AS day_sum FROM Customer GROUP BY visited_on ) a,
  (SELECT visited_on, SUM(amount) AS day_sum FROM Customer GROUP BY visited_on ) b
WHERE DATEDIFF(a.visited_on, b.visited_on) BETWEEN 0 AND 6  #각 날짜의 차이가 0~6인 것 추출 
GROUP BY a.visited_on
HAVING COUNT(b.visited_on) = 7   #각 날짜별로 매칭 값이 7개인 그룹만 2차 필터링

[파이썬 코드카타]

음양 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/76501

1) 어떤 문제가 있었나

순서대로 나열된 절대값 리스트와, boolean 리스트를 토대로 실제 정수의 합 구하기 

 

2) 내가 시도해본 건 무엇인가

for문에서 in 에 2개의 리스트를 넣어 2개 변수를 한 번에 추출하려고 했으나 오류 발생

  

3) 어떻게 해결했나

구글링을 통해 for문에서 2개의 변수를 활용할 때 zip 함수가 필요한 것을 알게 되어 풀이 완성 

def solution(absolutes, signs):
    answer = []    
    for a, s in zip(absolutes, signs):
        if s == True:
            answer.append(a*1)
        else:
             answer.append(a*-1)
    return sum(answer)


4) 무엇을 새롭게 알았나

- zip: 다중 리스트의 원소를 동일한 순서로 꺼내서 활용할 때 사용하는 함수. ex. for i, j in zip(list1, list2) 

 


- 파이썬 개인 과제 강의 풀이 및 해설 정리: https://datananalysis.tistory.com/66

- 데이터 분석 기초 개인 과제 강의 풀이 및 해설 정리:  https://datananalysis.tistory.com/67