인프런 커뮤니티 질문&답변

JJF님의 프로필 이미지

작성한 질문수

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

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

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

해결된 질문

24.08.13 15:55 작성

·

50

0

문제풀이를 해가던 도중

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

SELECT절에 적힌 WINDOW 함수 쿼리를

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

답변 1

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

2024. 08. 13. 15:56

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

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

JJF님의 프로필 이미지
JJF
질문자

2024. 08. 13. 22:33

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
카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

2024. 08. 14. 00:00

아하 감사합니다. 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가 나와서 저렇게 나오게 되었다고 생각해주시면 되어요.

JJF님의 프로필 이미지
JJF
질문자

2024. 08. 14. 11:09

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

JJF님의 프로필 이미지

작성한 질문수

질문하기