해결된 질문
24.08.13 15:55 작성
·
56
0
문제풀이를 해가던 도중
마지막 ROWS BETWEEN을 이용한 5가지 AMOUNT의 AVG를 구할때 소수점이 나오는데
SELECT절에 적힌 WINDOW 함수 쿼리를
ROUND, FLOOR 을 사용해서 감싸줘도 작동은 하지만 소수점이 사라지지 않는데 혹시 그 이유가 뭔가요???
답변 1
0
2024. 08. 13. 15:56
JJF님 안녕하세요! 혹시 사용하신 쿼리를 공유해주실 수 있으실까요~~?
쿼리를 보면 어떤 상황인지 정확히 파악할 수 있을 것 같아요!
2024. 08. 14. 00:00
아하 감사합니다. ROUND 함수 문서를 보면, Input 데이터가 어떤 형태인지에 따라 Output도 정해집니다.
https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#round
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
위 쿼리를 실행하면 아래와 같이 나옵니다.
정리하면, ROUND 함수는 동작했으나, Input에 어떤 타입의 데이터가 들어가는지에 따라 Output의 타입이 결정됩니다. 현재는 INT64(amount)가 들어가서 FLOAT64가 나와서 저렇게 나오게 되었다고 생각해주시면 되어요.
2024. 08. 13. 22:33
이런 식으로 ROUND와 FLOOR을 써봤을때 소수점 자리가 사라지지 않는 상황이 나와 어디서 잘못됐는지 못 찾아서 여쭤봤습니다!