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

정성욱님의 프로필 이미지
정성욱

작성한 질문수

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

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

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

해결된 질문

작성

·

70

0

문제풀이를 해가던 도중

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

SELECT절에 적힌 WINDOW 함수 쿼리를

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

답변 1

0

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

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

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

정성욱님의 프로필 이미지
정성욱
질문자

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

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

정성욱님의 프로필 이미지
정성욱
질문자

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

정성욱님의 프로필 이미지
정성욱

작성한 질문수

질문하기