강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của soiejung
soiejung

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

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

Viết

·

396

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

 

sqlmysql코딩-테스트

Câu trả lời 2

1

Gemma님의 프로필 이미지
Gemma
Người chia sẻ kiến thức

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 코드에 대해서 강의 수정 진행하도록 하겠습니다.

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

soiejung님의 프로필 이미지
soiejung
Người đặt câu hỏi

친절한 설명 감사합니다!

0

Gemma님의 프로필 이미지
Gemma
Người chia sẻ kiến thức

Soiejung 님, 안녕하세요.

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

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

Hình ảnh hồ sơ của soiejung
soiejung

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

Đặt câu hỏi