inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

SQL 코딩테스트를 위한 마지막 걸음

Date 강의 / leetcode 1321 질문

해결된 질문

225

이승렬

작성한 질문수 5

1

# [Setting]

USE PRACTICE;
DROP TABLE Customer;
CREATE TABLE Customer (customer_id int, name varchar(20), visited_on date, amount int);
INSERT INTO Customer (customer_id, name, visited_on, amount)
VALUES
(44, 'Ashley', '2019-01-04', 160),
(23, 'Sabo', '2019-01-04', 70),
(38, 'Moustafa', '2019-01-05', 90),
(30, 'Halley', '2019-01-06', 140),
(5, 'Elvis', '2019-01-07', 160),
(12, 'Leslie', '2019-01-08', 100),
(23, 'Sabo', '2019-01-08', 90),
(13, 'Will', '2019-01-09', 170),
(20, 'Brock', '2019-01-10', 160),
(29, 'Leo', '2019-01-10', 90),
(33, 'Isaac', '2019-01-11', 60),
(46, 'Selena', '2019-01-12', 100),
(4, 'Winston', '2019-01-13', 150),
(15, 'Marti', '2019-01-13', 160);
SELECT * FROM Customer;
# [my practice]
select b.visited_on, 
sum(amount) as amount, 
round(sum(a.amount) /7, 2) as average_amount
from customer a
inner join
(select distinct date_sub(visited_on, interval 6 day) as week_before, 
visited_on 
from customer) b
on a.visited_on between b.week_before and b.visited_on
group by b.visited_on
having count(amount) >= 7
order by b.visited_on;

올려주신 방식 외에 inner join시 date 구간으로 조건 넣는 방식으로 시도해 보았습니다.

위 데이터로 삽입하는 경우, MySQL Workbench에서는 예상 결과대로 출력 되는데 leetcode에서 오류가 나서 혹시 제가 코드 상에서 간과하고 있는 부분이 있는지 궁금해서 질문 드립니다.

leetcode 내에 PostgreSQL로 유사한 방식의 해결 법은 확인했었는데 혹시나 해서 링크 올려봅니다.

https://leetcode.com/problems/restaurant-growth/solutions/5040002/well-explained-postgresql-solution-beats-99

sql mysql 코딩-테스트

답변 1

1

Gemma

승렬님 안녕하세요:)

참신한 방법으로 풀어주셨는데요!

 

먼저 승렬님께서 간과했던 부분을 말씀드리겠습니다.

승렬님처럼 작성하면 2019-01-08 데이터가 포함됩니다.

데이터는 2019-01-04부터 시작하는데, 7일치의 데이터가 만들어지기 때문에 2019-01-08 데이터는 포함되면 안됩니다. (그런 의미에서 2019-01-09도 들어가면 안되는데, 승렬님 코드로 Output에 포함됨)

 

하지만 이렇게 잘못 포함된 이유는 having count(amount) >= 7로 작성하셨기 때문입니다.

그러면 160부터 90까지의 amount 데이터가 7개 존재하기 때문에, 2019-01-08 데이터도 조건에 포함되어서 들어가게 된 것입니다.

image


그럼 승렬님과 비슷한 로직으로 올바르게 작성하려면 아래와 같이 작성하면 됩니다.

(having절을 having count(distinct a.visited_on) = 7로 바꿨습니다.)

select b.visited_on,
sum(amount) as amount,
round(sum(a.amount) /7, 2) as average_amount
from customer a
inner join (
    select distinct date_sub(visited_on, interval 6 day) as week_before, 
    visited_on 
    from customer
) b
on a.visited_on between b.week_before and b.visited_on
group by b.visited_on
having count(distinct a.visited_on) = 7
order by b.visited_on;

 

이렇게 보면 헷갈릴 수 있으니 select * inner join order by까지만 작성 후 풀어헤쳐보면 아래와 같이 결과가 나올텐데요.

여기서 2019-01-08과 같은 데이터는 포함하지 않게 하기 위해서,

having절에 distinct a.visited_on의 개수가 7개가 되어야 한다는 조건을 추가해서 제거합니다.

image



혹시 읽으시고 이해가 안가면, 편하게 질문 다시 주셔요 :)

 

 

백준 사이트 준비중이라 문제를 볼 수 가 없어요

0

6

0

코딩살구클럽 가입부탁드립니다

0

15

2

57번

0

14

1

안녕하세요. 요약집 어디서 볼 수 있을까요?

0

13

1

코딩살구클럽 가입 요청 확인부탁드립니다

0

19

2

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

41

1

스크립트에 대해 질문 있습니다.

1

33

1

64비트 다운로드 링크

0

18

2

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

28

1

리뷰

0

22

1

조건 검색 질문

0

26

1

3번 문제 질문!

0

33

2

41번과 43번 문제

0

33

1

upload_file_id가 1,3,4 순서인 건에 대해

0

28

1

해당 차수 영상이 짤려 나갑니다

0

40

1

p.created_at vs u.name 인덱스 문의

0

38

2

콘솔 로그가 깨져나오는데 혹시 방법이 있을까요?

0

39

2

채점기능

0

31

1

5-S 테스트 케이스 질문

0

29

2

수강기간 연장 문의드립니다

1

37

2

주사위 게임

0

30

1

리뷰를 가장 많이 작성한 회원들 조회

0

63

2

LAG, LEAD 강의 550. Game Play Analysis IV 관련 질문

1

202

2

lag, leag 강의에서 game-play-analysis-iv 문제

1

448

2