이런 풀이는 왜 안되는지 궁금해요
SELECT S.id,
(CASE WHEN MOD(S.id,2)=0 THEN S2.student
WHEN S.id=count(S.id) THEN S.student
ELSE s3.student END) AS student
FROM Seat AS S INNER JOIN Seat AS S2 ON S.id -1 =S2.id
INNER JOIN Seat AS S3 ON S.id +1 =S3.id;짝수, 마지막 수, 홀수 기준으로 출력해주려고 하는데, 실제 output에서는 id 2인 친구만 출력이 되네요. 어떤 부분이 틀렸는지 궁금합니다!
+강의에서 COUNT(*)에 OVER문을 써야하는 이유도 궁금합니다. 그냥 COUNT(id)만 해도 같은 답이 되는 것 같은데 아닐까요 ㅠㅠ??
Answer 1
1
group by 없이 바로 count 등의 집계함수를 사용하면 여러 개의 row가 있다 하더라도 단 하나의 row만 출력됩니다.
select id, student, count(id)
from seat위 쿼리를 직접 돌려보시면 무슨 말인지 아실 거에요. 더 자세한 내용은 이 링크의 글을 참고해 보시면 좋을 것 같고요. 풀이 과정에서는 seat 테이블의 모든 row가 필요하기 때문에 count(id)가 아닌 count(*) over를 사용했습니다.
직접 작성하신 쿼리에서도 case 절 안의 count(S.id) 때문에 output이 한 줄만 출력되는 문제가 발생합니다. 강의 풀이처럼 여기를 count(*) over 로 바꾸는 방법이 있는데, 이렇게 해도 5줄이 아니라 3줄만 출력되고 정답 처리도 되지 않을 거에요.
왜냐하면 select 절보다 from 절의 join이 먼저 실행되기 때문입니다. join으로 서로 붙어서 만들어진 테이블로부터 select에 쓴 데이터를 가져오게 되는데, join key를 맵핑하는 과정에서 일부 row가 누락되었습니다.
s.id - 1 = s2.id -- s.id=1일 경우 1-1=0인데 s2.id=0인 데이터는 없으므로 s.id=1인 row가 누락됩니다.
s.id + 1 = s3.id -- s.id=5일 경우 5+1=6인데 s3.id=6인 데이터는 없으므로 s.id=5인 row가 누락됩니다.만들어진 테이블이 모든 데이터를 포함하지 못하므로 이 안에서 연산을 해도 정답이 나오지 않습니다.
강의기간 연장문의
0
96
2
HackerRank : Weather Observation Station 11 문제풀이
0
116
1
SET4의 3번 자리바꾸기 문제 다른 풀이
0
186
1
set 3의 3번 문제- 데이터의 개수가 짝수일 때 질문
0
263
2
set 1 - 2번 문제풀이
0
258
1
세트2번 Binary Tree Nodes 질문입니다!
0
225
2
고급문제풀이set1 3번 문제
0
249
2
고급문제풀이 3번 INNERJOIN 활용시 오류
0
269
1
회사일하다 보니까 다 못듣고 수강기간이 다끝나가는데 .,. 수강기간 연장은 어떻게 할수 있나요?ㅜㅜ
0
320
1
[Weather 20 ] 2번째 쿼리도 따라 했는데 왜 다 실패일까요?
0
372
1
[Weather 20] 따라 했는데 왜 작동 안해요?
0
274
1
weather-20 왜 작동 안하는건가요?
0
226
1
Ollivander's Inventory 윈도우 함수 min() over
0
310
1
LeetCode 626. Exchange Seats 리트코드 제출 오류
0
506
2
섹션4에 3번 문제풀이 질문
0
376
2
SQL Project Planning 풀이 관련 문의
0
579
2
섹션 1번 4번문제 풀이
1
283
1
섹션1 2번 문제풀이 강의
0
301
1
set2 - 1 같게 작성했는데 답이 이상합니다.
0
285
1
max함수를 써서 풀지는 못하나요?
0
297
1
윈도우 함수를 이용해서 풀고 싶어서 써봤습니다. 더 간단하게 줄일 수 있을까요?
0
257
1
(Hacker Rank)Binary Tree 문제 질문
0
325
1
쿼리 두개로 작성하고 싶지 않아 하나로 어떻게든 만들어 봤습니다.
0
292
1
소수점 이하 숫자가 안나옵니다 ㅠㅠ
0
323
2

