[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
'TIL' 카테고리의 다른 글
[240130-31] 머신러닝 - 선형회귀, 로지스틱회귀 (1) | 2024.01.31 |
---|---|
[240130] SQL: 코드카타 117 & 파이썬: 코드카타 27 (0) | 2024.01.30 |
[240124-26] 데이터 전처리 & 시각화 (1) | 2024.01.26 |
[240125] SQL: 코드카타 115 & 파이썬: 코드카타 24 (1) | 2024.01.25 |
[240124] SQL: 코드카타 113~114 & 파이썬: 코드카타 23 (0) | 2024.01.24 |