inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bước cuối cùng hướng tới kiểm tra mã hóa SQL

trễ, dẫn đầu

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

Đã giải quyết

467

soiejung

1 câu hỏi đã được viết

1

https://leetcode.com/problems/game-play-analysis-iv/ 

이 문제를 풀고 있는데,

제가 작성한 코드는

SELECT ROUND(COUNT(player_id) /(SELECT COUNT(DISTINCT player_id) FROM Activity),2) as fraction

FROM

(

SELECT player_id,

LAG(player_id) OVER (ORDER BY player_id) AS prev_id,

LAG(event_date) OVER (ORDER BY player_id) AS prev_date,

event_date,

RANK() OVER (PARTITION BY player_id ORDER bY event_date) AS rnk

FROM Activity

) A

WHERE rnk = 2

AND DATE_ADD(prev_date, INTERVAL 1 day) = event_date AND player_id = prev_id

입니다. 이 코드로 정답을 체크해 보았을 때 wrong answer라 뜨지만, A FROM절 안에서 event_date, rnk의 순서를 LAG 앞으로 바꾸어 주었을 땐 정답 처리가 되었습니다. 왜 그런걸까요??

아래는 순서를 바꿨을 때 정답처리 되었던 코드 입니다.

SELECT ROUND(COUNT(player_id) /(SELECT COUNT(DISTINCT player_id) FROM Activity),2) as fraction

FROM

(

SELECT player_id,

event_date,

RANK() OVER (PARTITION BY player_id ORDER bY event_date) AS rnk,

LAG(player_id) OVER (ORDER BY player_id) AS prev_id,

LAG(event_date) OVER (ORDER BY player_id) AS prev_date

FROM Activity

) A

WHERE rnk = 2

AND DATE_ADD(prev_date, INTERVAL 1 day) = event_date AND player_id = prev_id

 

sql mysql 코딩-테스트

Câu trả lời 2

1

Gemma

Soiejung 님,

컬럼의 순서에 따라 정답/오답이 결정나는 것은 아니였고, right answer라고 나온 두번째 코드는 test case를 모두 통과해서 옳은 정답으로 우연히 나온 것입니다. wrong answer라고 나온 첫번째 코드 기준으로 설명 드리겠습니다.



일단 Soiejung님께서 첨부해주신 코드 중

LAG(event_date) OVER (ORDER BY player_id) AS prev_date

가 아닌,

LAG(event_date) OVER (ORDER BY player_id, event_date) AS prev_date

로 작성해야 됩니다. (강의 코드 기준)

그래야지 아래 그림처럼, 해당 player_id의 직전 event_date가 순서대로 나옵니다.

image


다만, 제가 강의에서 간과했던 부분이 prev_id도

LAG(player_id) OVER (ORDER BY player_id, event_date) AS prev_id

로 ORDER BY event_date를 추가해야 됩니다.

prev_id에 ORDER BY event_date를 추가하지 않는다면, 아래 그림처럼 prev_date와 동일하게 null로 찍혀야 되는 row가 서로 달라지게 됩니다.

image

따라서 prev_date처럼, prev_id에도 동일하게 ORDER BY event_date를 추가해줘야 합니다.

그럼 아래처럼 동일한 row에 대해서 null로 찍히게 될 것입니다.

image


따라서 Soiejung 님께서 2번째 코드로 right answer라고 나온 부분은 우연히 모든 test case를 통과해서 맞은 것처럼 나왔지만 실제로 틀린 코드입니다. 1번째 코드의 prev_id와 prev_date를 올바르게 수정해서 다시 돌린다면, right answer로 나오게 될 것입니다.

 

추후 prev_id 코드에 대해서 강의 수정 진행하도록 하겠습니다.

읽어보시고, 이해가 안가신다면 편하게 다시 질문 부탁드립니다! :)

1

soiejung

친절한 설명 감사합니다!

0

Gemma

Soiejung 님, 안녕하세요.

Soiejung님 버전 코드까지 같이 첨부해주셔서 제가 답변하기가 훨씬 수월해졌는데요 :)

위에 질문에 대한 답변은 이번주 일요일까지 드리겠습니다! 답변 바로 드리지 못한 점 양해부탁드립니다.

PK를 AUTO_INCREMENT UUID를 UNIQUE로 하는것에 대해

0

10

1

본질 및 인조 식별자 질문

0

10

1

Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)

1

15

1

런타임 에러

0

12

0

pk를 auto increment로 하는것에 대해서

0

15

1

슈퍼키 문의

0

14

1

질문있습니다!

0

16

1

트랜잭션 내 Redis I/O 에 대한 궁금한점

1

31

1

코딩 살구클럽 가입 문의

0

41

2

3-13 리텐션 과제 제출합니다!

0

58

2

경쟁상태

0

49

1

stmt

0

41

1

실행 통계2 explain analyze 조인 쿼리

0

46

1

3강 인덱스 구조 강의 자료 문의

1

59

1

[해결됨]마지막 강의 내용 수정 화면이 기능을 못하네요.

0

49

1

[해결됨]부분적으로 화면 이동이 안되는 부분이 있습니다.

0

85

6

68강 문제 풀이

0

43

1

현대 쿼리 복잡성에 관한 질문

0

90

3

Queue

0

44

1

key_length 가 사용되는곳

0

45

1

[과제]1-9 피벗 테이블 만들어보기

0

65

2

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

0

81

2

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

1

219

2

Date 강의 / leetcode 1321 질문

1

249

1