inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

2-8. 윈도우 함수 Frame 연습 문제

FRAME 연습 마지막 AVG 문제 소수점에 대하여 여쭤볼게 있습니다!

해결된 질문

165

정성욱

작성한 질문수 2

0

문제풀이를 해가던 도중

마지막 ROWS BETWEEN을 이용한 5가지 AMOUNT의 AVG를 구할때 소수점이 나오는데

SELECT절에 적힌 WINDOW 함수 쿼리를

ROUND, FLOOR 을 사용해서 감싸줘도 작동은 하지만 소수점이 사라지지 않는데 혹시 그 이유가 뭔가요???

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

카일스쿨

JJF님 안녕하세요! 혹시 사용하신 쿼리를 공유해주실 수 있으실까요~~?

쿼리를 보면 어떤 상황인지 정확히 파악할 수 있을 것 같아요!

0

정성욱

SQL.PNG

 이런 식으로 ROUND와 FLOOR을 써봤을때 소수점 자리가 사라지지 않는 상황이 나와 어디서 잘못됐는지 못 찾아서 여쭤봤습니다!

SELECT
  *,
  ROUND(AVG(amount) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING), 0) AS amount_avg_5days,
  FLOOR(AVG(amount) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING)) AS amount_avg_5days_FLOOR
FROM 
 `advanced.orders` 
ORDER BY 
  order_id

0

카일스쿨

아하 감사합니다. ROUND 함수 문서를 보면, Input 데이터가 어떤 형태인지에 따라 Output도 정해집니다.

https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#round

 

스크린샷 2024-08-13 오후 11.56.49.png

 

INT64, FLOAT64가 Input으로 온다면, Output도 FLOAT64로 나오게 됩니다. 그래서 소수점이 남게 됩니다. 이럴 경우엔 타입을 변경해주셔야 합니다

 

Input을 NUMERIC으로 주시면 Output도 NUMERIC이 나와서 소수점이 사라지게 됩니다.

 


SELECT
  *,
  ROUND(AVG(SAFE_CAST(amount AS NUMERIC)) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING), 0) AS amount_avg_5days
FROM 
 `advanced.orders` 
ORDER BY 
  order_id

 

 

또는, SAFE_CAST를 사용해서 강제로 INT64로 변경하는 방법도 있습니다


SELECT
  *,
  SAFE_CAST(AVG(amount) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS INT64) AS amount_avg_5days2,
FROM 
 `advanced.orders` 
ORDER BY 
  order_id

 

 


SELECT
  *,
  ROUND(AVG(SAFE_CAST(amount AS NUMERIC)) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING), 0) AS amount_avg_5days,
  SAFE_CAST(AVG(amount) OVER(ORDER BY order_date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS INT64) AS amount_avg_5days2,
FROM 
 `advanced.orders` 
ORDER BY 
  order_id

 

위 쿼리를 실행하면 아래와 같이 나옵니다.

스크린샷 2024-08-13 오후 11.59.34.png

 

 

 

정리하면, ROUND 함수는 동작했으나, Input에 어떤 타입의 데이터가 들어가는지에 따라 Output의 타입이 결정됩니다. 현재는 INT64(amount)가 들어가서 FLOAT64가 나와서 저렇게 나오게 되었다고 생각해주시면 되어요.

1

정성욱

오 그렇군요 신기하네요! 이번에 또 새로운 지식을 얻어 가네요! 감사합니다!

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

0

12

1

app logs 데이터로 쿼리 연습

0

38

2

[과제] 연습문제 쿼리 작성했습니다!

0

30

2

6-1. 강의 최종 과제 제출합니다.

0

59

3

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

0

119

3

3-13. 리텐션 연습과제 제출합니다.

0

92

4

최종 과제 제출

0

78

3

Weekly Retention 과제 작성하였습니다.

0

68

2

3-10 강의 14분경 코호트 해석 질문드립니다.

0

78

2

Weekly 및 Monthly Retention 과제 제출합니다.

0

75

2

[과제] 퍼널 쿼리 PIVOT 테이블 작성

0

78

2

최종 과제 제출

0

146

3

BigQuery 활용편 18강 질문있습니다!

0

111

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

116

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

109

2

biquery 테이블 생성 오류 이슈

0

110

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

114

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

113

2

array 등

0

95

2

N day 리텐션 쿼리 관련 질문

0

100

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

99

2

윈도우 연습문제 1번 질문

0

94

1

user_id에 NULL이 나오는데 정상인가요?

0

111

2

3-13 리텐션 과제 제출

0

153

2