기술 자료

지원

Analytics

Analytics

SQL 데이터 탐색기

Write custom SQL queries to analyze your Analytics data and create visualizations.
읽는 시간 3분최근 업데이트: 3일 전

SQL 데이터 탐색기를 사용하면 데이터에 읽기 전용 SQL 쿼리를 실행하고 결과를 다양한 시각화 유형으로 구성하여 대시보드에 추가할 수 있습니다. 다른 분석 제품에서 파악할 수 없는 인사이트를 얻을 수 있습니다. SQL cookbook (영문)의) ‘recipes’ 컬렉션을 참고하십시오. 쿼리는 Snowflake 기반으로 실행되므로 Snowflake SQL dialect를 사용합니다. SELECT가 아닌 문과 $SYSTEM 커맨드는 기능 측면에서 제한을 받습니다.
참고
SQL 데이터 탐색기 쿼리는 쿼리 초를 기준으로 비용이 청구됩니다. 자세한 내용은 Analytics 과금을 참고하십시오.
막대 차트, 선 그래프, 영역 그래프, 파이 차트, 누적 막대 차트 간에 전환하며 사용할 수 있습니다. SQL은 데이터베이스와의 통신에 사용되는 프로그래밍 언어입니다. SQL 데이터 탐색기를 사용하려면 SQL 쿼리 작성에 대한 기본적인 이해가 필요합니다. 다음 코드는 SQL 데이터 탐색기를 사용할 때의 기본 SQL 쿼리를 보여 줍니다. 직접 쿼리를 작성해도 됩니다.
select EVENT_DATE, count(distinct USER_ID) from EVENTSwhere EVENT_DATE > CURRENT_DATE-7group by EVENT_DATEorder by EVENT_DATE desc
이 쿼리는 지난 7일 동안 게임을 플레이한 고유 사용자의 수를 계산합니다. 쿼리를 실행한 후에는 차트를 설정합니다. 현재 Y축 2개과 X축 1개가 지원됩니다. 각각의 열과 단위를 선택합니다. 축 레이블의 이름을 변경하려면 SQL 쿼리에서 축 이름을 다시 지정하는 as 표현식을 사용합니다.
X축과 Y축으로 차트를 설정합니다. 세 가지 차트 스타일(꺾은선형, 막대형, 영역형) 중에서 선택합니다.
선 차트
막대 차트로 그래프 스타일 변경
영역 차트 데이터 순서를 지정하지 않고 쿼리를 실행하면 차트가 정렬되지 않아 데이터가 정확하게 표현되지 않을 수도 있습니다. 이 경우 경고가 표시되므로 ‘order by’ 키워드를 사용하여 쿼리를 정렬하는 것이 좋습니다. 차트 아래에는 쿼리의 열과 결과를 보여주는 결과 테이블이 있습니다.
결과 테이블 용어집 패널은 쿼리에 사용할 수 있는 파라미터의 목록을 제공합니다. 클립보드에 파라미터를 복사합니다. 용어집의 용어는 두 가지 소스, 즉 데이터베이스 열 이름(예: EVENT_DATE)과 이벤트 json에서 파싱된 커스텀 파라미터에서 가져온 것입니다. JSON 데이터 쿼리 방법에 대한 Snowflake 기술 자료(영문)를 참고하십시오. 전송하는 이벤트에 따라 커스텀 파라미터를 정의할 수 있습니다. 일부 파라미터는 SQL의 구문을 변경할 수 있는 Snowflake 전용 필드입니다. JSON에서 파싱된 파라미터보다 데이터베이스 열 이름을 사용하는 것이 쿼리에 더 효율적이므로, 가능하면 데이터베이스 열 이름을 사용하는 것이 좋습니다. 파라미터가 열(예: USER_COUNTER)로 표시되는 경우 쿼리는 다음과 같이 파라미터를 사용합니다. USER_COUNTRY 또는 파라미터가 이벤트 자체(예: ‘missionName’이라는 파라미터)에서 비롯되는 경우 다음 방식으로 액세스됩니다. EVENT_JSON:missionName::STRING 이벤트 관리자를 사용하여 쿼리에 열로 사용할 커스텀 이벤트를 생성할 수 있습니다.
용어집 패널 리포트를 사용하여 쿼리를 저장합니다. 리포트에서 모든 쿼리의 목록을 제공하므로 나중에 다시 로드하여 사용할 수 있습니다.
환경 선택자를 사용하여 Unity 환경 간에 전환할 수 있습니다.

미션 통계

이 예시에서는 missionID 파라미터로 플레이어의 미션 참여도를 트래킹하는 커스텀 이벤트를 사용하여 미션 실패율을 살펴봅니다.
이 쿼리의 경우 기본 EVENTS 테이블을 사용합니다. 이 테이블에는 게임에 기록된 모든 이벤트에 대한 세분화된 데이터가 포함되어 있습니다.
SELECT EVENT_JSON:missionID::INTEGER AS missionID, count(distinct case when event_name = 'missionStarted' then user_id else null end) AS starts, round((count(distinct case when event_name = 'missionFailed' then user_id else null end) /starts)*100) AS "Players failed %"FROM EVENTSWHERE missionID <=10 -- Focus on the first few levels AND event_name in ('missionStarted','missionFailed') AND event_date>current_date-30 -- Use a date filter for efficiencyGROUP BY missionIDORDER BY missionID
여기에서는 날짜 필터
event_date>current_date-30
을 사용하여 쿼리를 제한했습니다. 이렇게 하지 않으면 SQL 데이터 탐색기가 기본값인 365일을 기준으로 쿼리 가능한 데이터에 대해 쿼리를 실행합니다.
결과를 사용하여 그래프를 구성합니다. \
![](/analytics/media/images/copy-of-sql-bar-chart.png)

\

Y축이 위에서 정의한 이름인 ‘Players failed %’로 표시됩니다.

(mod)hash

게임이 점점 더 성장하면서 플레이어 기반이 커지면 간단한 쿼리를 실행하는 데도 상당한 시간이 걸릴 수 있습니다. 다음 기본 쿼리를 살펴보시기 바랍니다.
SELECT count(distinct event_name, user_id)/count(distinct user_id) as "avg number of event types per user"FROM EVENTSWHERE event_date>current_date-7
데이터 세트가 커서 실행하는 데 시간이 꽤 걸립니다. user_id가 해시로 저장되므로 다음과 같이 코드를 재작성할 수 있습니다.
SELECT count(distinct event_name, user_id)/count(distinct user_id) as "avg number of event types per user"FROM EVENTSWHERE event_date>current_date-7AND mod(hash(user_id),100) = 63
여기에서는 사용자를 가상의 무작위 번호가 할당된 100개의 버킷으로 분할하고, 버킷 번호 63을 확인합니다. 계산이 복잡해지는 경우 이러한 방식으로 데이터를 필터링하면 시간을 절약할 수 있습니다.

데이터 간소화

100% 정확도를 고수할 필요가 없는 경우 쿼리 속도를 높이는 간단한 방법은
approximate_count_distinct
를 사용하는 것입니다. 기존 쿼리는 다음과 같은 형태로 구성됩니다.
SELECT approximate_count_distinct(event_name, user_id)/ approximate_count_distinct(user_id) as "avg number of event types per user"FROM EVENTSWHERE mod(hash(user_id),100) = 63
오브젝트의 크기를 줄여 이 쿼리를 개선할 수 있습니다. 용어집을 살펴보고 어떤 테이블을 쿼리할 수 있는지 알아보십시오. UGS에서는 다음과 같은 테이블을 즉시 사용할 수 있습니다.
  • EVENTS
  • USERS: 게임 내에서의 활동 주기 지표와 함께 각 플레이어의 정보가 단일 행에 담겨 있습니다.
  • FACT_USER_SESSIONS_DAY: 각 플레이어의 세션별 데이터를 포함합니다.
  • FACT_EVENT_TYPE_USERS_DAY: 플레이어가 매일 전송한 각 이벤트가 총 개수와 함께 하나의 행으로 구성됩니다.
  • FACT_WAU_USERS 및 FACT_MAU_USERS: 주어진 날로부터 지난 1주일이나 한 달 동안 플레이한 사용자의 프로필 데이터를 포함합니다.
FACT_EVENT_TYPE_USERS_DAY와 FACT_USER_SESSIONS_DAY 테이블에서 오브젝트의 크기를 줄여도 쿼리 80% 이상에 대한 답은 구할 수 있을 것입니다. 예를 들어 첫 번째 쿼리에서는 미션 실패율을 살펴보았는데, 이 테이블에 저장된 NUMBER_OF_EVENT 수와 FACT_EVENT_TYPE_USER_DAY를 사용하면 일별 전체 실패율을 계산할 수 있습니다.
SELECT event_date, round((SUM(case when event_name='missionFailed' then number_of_events else null end) / SUM(case when event_name='missionStarted' then number_of_events else null end))*100) as overallFailRateFROM FACT_EVENT_TYPE_USERS_DAYWHERE event_name in ('missionStarted','missionFailed')AND event_date>current_date-30GROUP BY event_dateORDER BY event_date

데이터 피벗

새로운 마법사를 사용하여 데이터를 피벗하고, 편집하고, 피벗을 해제할 수 있습니다.

이벤트 스트림

이 쿼리를 사용하여 특정 기준을 충족하는 플레이어의 이벤트 스트림을 확인할 수 있습니다. 위에서 설명한 USERS 테이블을 사용하면 실행할 때마다 다른 사용자를 가져오므로 QA와 디버깅에 유용합니다. 예를 들어 특정 버전의 게임을 설치한 플레이어의 이벤트가 올바르게 기록되지 않는 것으로 의심되는 경우 다음 쿼리를 실행할 수 있습니다.
SELECT event_timestamp, event_name, EVENT_JSON:sessionID::STRINGFROM EVENTSWHERE client_version LIKE '0.0%'AND user_id IN (SELECT user_idFROM USERSWHERE start_date BETWEEN '2022-07-01' AND '2022-07-08'LIMIT 1 —- pull out just one user)ORDER BY event_timestamp

SQL 데이터 탐색기 쿼리 가능 테이블

SQL 데이터 탐색기를 통해 여러 테이블에 액세스할 수 있습니다.

EVENTS

이 테이블에는 애플리케이션에서 전송된 모든 이벤트가 나열됩니다. 이벤트별 파라미터는 EVENT_JSON 열에 JSON 객체로 있습니다. 파라미터가 JSON 객체로 저장되기 때문에 콘텐츠를 쿼리하려면 해당 콘텐츠를 파싱해야 합니다. 이 저장소에 포함된 샘플에서 파라미터 파싱 예시를 확인할 수 있습니다. 파라미터 이름을 입력하고 Tab 키를 누르면 구문이 자동으로 완성되어 구문을 가져오고 파라미터를 파싱할 수도 있습니다. 이 테이블은 1-2시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) EVENT_ID(숫자) EVENT_JSON(배리언트) AGE_GROUP(텍스트) ACQUSITION_CHANNEL(텍스트) MAIN_EVENT_ID(숫자) PLATFORM(텍스트) EVENT_DATE(날짜) EVENT_LEVEL(숫자) CLIENT_VERSION(텍스트) USER_ID(텍스트) USER_COUNTRY(텍스트) EVENT_TIMESTAMP(타임스탬프) PLAYER_START_DATE(날짜) EVENT_NAME(텍스트) GENDER(텍스트)

USERS

이 테이블에는 이전에 이벤트를 전송한 모든 사용자가 나열됩니다. 사용자별로 열에 여러 가지 유용한 지표가 포함됩니다. 특히 지표 열에는 SQL 분석 함수를 사용하여 계산되는 지표가 있습니다. 이 테이블은 3-4시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) ACQUISITION_CHANNEL(텍스트) BIRTH_YEAR(정수) MESSAGE_COUNTS(배리언트) COUNTRY(텍스트) LAST_LOCALE(텍스트) LAST_SESSION_ID(텍스트) START_DATE(날짜) DDNA_CROSS_GAME_USER_ID(텍스트) IS_SDK_NATIVE(정수) CREATED_TIMESTAMP(타임스탬프) LAST_PLATFORM(텍스트) LAST_UPDATED_TIMESTAMP(타임스탬프) COHORTS(텍스트) LAST_ANDROID_REGISTRATION_ID(텍스트) LAST_PUSH_NOTIFICATION_TOKEN(텍스트) METRICS(배리언트) GENDER(텍스트) USER_ID(텍스트) CUSTOM_VALUES(배리언트) UNITY_CAMPAIGNS(배리언트) LAST_EVENT_TIMESTAMP(타임스탬프) LAST_TIMEZONE_OFFSET(텍스트) LAST_SEEN_TIMESTAMP(타임스탬프)

FACT_USER_SESSIONS_DAY

이 테이블에는 각 사용자 세션의 기록이 있으며, 각 기록에는 해당 세션의 다양한 사용자 레벨 집계 API가 포함됩니다. 집계 차원을 제외하고 이 테이블에 기록된 차원(예: AGE_GROUP, GENDER)이 세션 도중에 변경되면 해당 세션에 새 기록이 생성됩니다. 이 테이블은 1-2시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) MISSION_ABORTED(정수) CLIENT_VERSION(텍스트) AGE_GROUP(텍스트) MISSIONS_FAILED(정수) INVITES_ACCEPTED(정수) PLAYER_START_DATE(날짜) MISSIONS_COMPLETED(정수) NUMBER_OF_EVENTS(정수) USER_COUNTRY(텍스트) INVITES_SENT(정수)

FACT_EVENT_TYPE_USERS_DAY:#

이 테이블에는 하루 동안 사용자가 기록한 모든 이벤트와 더불어 각 이벤트를 전송한 횟수가 나열됩니다. 이 테이블은 1-2시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) GENDER(텍스트) CLIENT_VERSION(텍스트) EVENT_DATE(날짜) NUMBER_OF_EVENTS(정수) PLATFORM(텍스트) ACQUISITION_CHANNEL(텍스트) INSERTED_TIMESTAMP(타임스탬프) USER_ID(텍스트) AGE_GROUP(텍스트) EVENT_NAME(텍스트) PLAYER_START_DATE(날짜) USER_COUNTRY(텍스트)

FACT_WAU_USERS

이 테이블에는 지난 7일간 이벤트를 전송한 모든 사용자가 나열됩니다. 이 테이블은 1-2시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) PLAYER_START_DATE(날짜) USER_ID(텍스트) INSERTED_TIMESTAMP(타임스탬프) EVENT_DATE(날짜) USER_COUNTRY(텍스트) PLATFORM(텍스트) GENDER(텍스트) ACQUISITION_CHANNEL(텍스트) CLIENT_VERSION(텍스트) AGE_GROUP(텍스트)

FACT_MAU_USERS

이 테이블에는 지난 30일간 이벤트를 전송한 모든 사용자가 나열됩니다. 이 테이블은 1-2시간마다 업데이트됩니다. 열: UNITY_ENVIRONMENT_NAME(텍스트) UNITY_APPLICATION_NAME(텍스트) PLAYER_START_DATE(날짜) USER_ID(텍스트) INSERTED_TIMESTAMP(타임스탬프) EVENT_DATE(날짜) USER_COUNTRY(텍스트) PLATFORM(텍스트) GENDER(텍스트) ACQUISITION_CHANNEL(텍스트) CLIENT_VERSION(텍스트) AGE_GROUP(텍스트) 위 테이블을 통해 데이터에 액세스하기 위해 작성할 수 있는 SQL 쿼리의 예시는 SQL 데이터 탐색기 Cookbook(영문)을 참고하십시오.