inflearn logo
강의

Course

Instructor

[A hundred words are not as good as seeing once] Advanced SQL problem solving for data analysis

Solution to problem 3 2

set 3의 3번 문제- 데이터의 개수가 짝수일 때 질문

263

95980

1 asked

0

set 3의 3번 문제에서, 데이터의 개수가 짝수일 때 다음 쿼리문을 알려주셨는데요.

SELECT ROUND(AVG(LAT_N), 4)

FROM (

    SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) - 1 AS row_num

         , COUNT(*) OVER () - 1 AS row_total

         , LAT_N

    FROM Station

    ) t

WHERE row_num IN (FLOOR(row_total / 2), CEIL(row_total / 2))

이때, 왜 ROW_NUMBER()와 COUNT(*) 에서 각각 1을 빼는건가요? 각각 1을 빼지 않아도 정답이 잘 출력되는데, 혹시 이 문제에서는 드러나지 않는 예외상황이 있는걸까요?

sql

Answer 2

0

jaemin

'3번 문제 풀이 1' 강의에서 ROW_NUMBER()를 사용해 데이터 개수가 홀수인지 짝수인지와 관계없이 언제든 사용할 수 있는 풀이를 소개해 드렸습니다.

여기서 짝수일 때만 쓸 수 있는 부분만 떼어서 '3번 문제 풀이 2' 강의의 노트에 적어둔 것인데요.

'3번 문제 풀이 1' 쿼리의 WHERE 절에서 +1을 하는 과정을, '3번 문제 풀이 2'에서는 SELECT 절에서 -1을 하는 것으로 대체했다고 생각하시면 됩니다.

두 쿼리를 비교해 보시면 이해하실 수 있을 거에요.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 답변 드리겠습니다.

SQL에서 ROW_NUMBER() 함수는 각 행에 대해 순차적인 번호(1부터 시작)를 할당합니다. 짝수 개수의 데이터를 가진 데이터셋에서 중앙값을 찾기 위해선 중앙에 위치한 두 값을 찾아 평균을 내야 합니다.

예를 들어 데이터가 4개라면, 중앙 값은 2번째와 3번째 값입니다. 하지만, ROW_NUMBER()는 1부터 카운트하기 때문에, 데이터셋이 0부터 시작하는 것처럼 보정하기 위해서 1을 빼주는 것입니다. row_num 계산에서 -1을 하는 이유는 이러한 0 기반 인덱싱을 만들기 위함입니다.

COUNT(*) OVER ()는 전체 행의 수를 반환합니다. 짝수 개수의 데이터셋에서 마지막 인덱스를 구하기 위해서는 전체 개수에서 1을 빼야 합니다. 그 이유는 전체 행의 수가 4라면, 0 기반 인덱스를 사용할 때 마지막 인덱스는 3이 되기 때문입니다.

row_total 계산에서 -1을 빼는 것도 위와 동일한 이유로, 0부터 시작하는 인덱스 체계에 맞추기 위함입니다.

님이 언급하신 대로, 때때로 위의 방식으로 계산하지 않더라도 올바른 결과를 얻을 수 있습니다. 그러나 데이터셋 또는 사용하는 SQL의 버전에 따라 인덱스 계산 방식이 달라 예외 상황이 발생할 수 있습니다. 1을 빼는 것은 이러한 예외 상황을 회피하기 위한 견고한 코딩 습관의 일환입니다.

질문에 충분한 답변이 되었기를 바랍니다. 추가 질문이 있으시면 언제든 질문해 주세요.

강의기간 연장문의

0

96

2

HackerRank : Weather Observation Station 11 문제풀이

0

116

1

SET4의 3번 자리바꾸기 문제 다른 풀이

0

186

1

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

273

1

소수점 이하 숫자가 안나옵니다 ㅠㅠ

0

323

2