inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

146

정성욱

작성한 질문수 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

정성욱

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

최종 과제 제출

0

82

3

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

0

84

1

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

0

83

2

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

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

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

0

74

2

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

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

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

0

69

2

윈도우 연습문제 1번 질문

0

65

1

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

0

73

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

107

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2