FRAME 연습 마지막 AVG 문제 소수점에 대하여 여쭤볼게 있습니다!
문제풀이를 해가던 도중
마지막 ROWS BETWEEN을 이용한 5가지 AMOUNT의 AVG를 구할때 소수점이 나오는데
SELECT절에 적힌 WINDOW 함수 쿼리를
ROUND, FLOOR 을 사용해서 감싸줘도 작동은 하지만 소수점이 사라지지 않는데 혹시 그 이유가 뭔가요???
답변 1
0
JJF님 안녕하세요! 혹시 사용하신 쿼리를 공유해주실 수 있으실까요~~?
쿼리를 보면 어떤 상황인지 정확히 파악할 수 있을 것 같아요!
0
이런 식으로 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

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





