실제 세션 수익과 포인트 적립 데이터를 PVI 기준으로 역산 검증하여 QA 실시간 데이터 정합성 확보
실제 세션 수익과 포인트 적립 데이터가 PVI별로 일치하지 않은 사례가 있었음.
기존에는 명확한 산출이 나올 수 없는 구조라 모니터링이 어려워 수동검증을 하였고, 이로인해 QA 업무 효율도 낮게 나타나며 금전적 오산출 리스크가 종종 발생했음
WITH PVI_CATEGORIZED AS (
SELECT
POOL_GROUP_ID, GP_ID, PVI,
CASE
WHEN PVI >= 0.1 AND PVI < 0.5 THEN '0.1 ~ 0.49'
WHEN PVI >= 0.5 AND PVI < 0.8 THEN '0.5 ~ 0.79'
WHEN PVI >= 0.8 AND PVI < 1.0 THEN '0.8 ~ 0.99'
END AS PVI_Category
FROM DW_POKER_DESIGN."PUBLIC".PVI
WHERE PVI BETWEEN 0.1 AND 0.99
),
SESSION_RAKE AS (
SELECT
GP_ID,
TO_DATE(TIMESTAMPADD(hour, -15, USER_SESSION_STARTED_AT)) AS TARGET_DATE,
SUM(V_RAKE_OR_FEE) AS TOTAL_V_RAKE
FROM (
SELECT GP_ID, V_RAKE_OR_FEE, USER_SESSION_STARTED_AT, USER_SESSION_FINISHED_AT FROM DW_ORIGIN_GLOBAL.GLOBAL_GP_DB_STATS.STATISTICS_GAME_POKER_PER_SESSION WHERE IS_PLAY_MONEY = FALSE
UNION ALL
SELECT GP_ID, V_RAKE_OR_FEE, USER_SESSION_STARTED_AT, USER_SESSION_FINISHED_AT FROM DW_ORIGIN_WSOP.WSOP_GP_DB_STATS.STATISTICS_GAME_POKER_PER_SESSION WHERE IS_PLAY_MONEY = FALSE
)
WHERE USER_SESSION_STARTED_AT >= '2025-07-16 15:00:00'
AND USER_SESSION_FINISHED_AT < '2025-12-01 15:00:00'
GROUP BY GP_ID, TO_DATE(TIMESTAMPADD(hour, -15, USER_SESSION_STARTED_AT))
),
SOURCE_SUM AS (
SELECT
B.GP_ID,
TO_DATE(TIMESTAMPADD(hour, -15, A.SOURCE_CREATED_AT)) AS TARGET_DATE,
SUM(A.VALUE) AS TOTAL_SOURCE_VALUE
FROM DW_WAREHOUSE."PUBLIC".GP_POINT_HISTORY A
INNER JOIN DW_WAREHOUSE."PUBLIC".GP_REWARD_ATTENDEE B ON A.ATTENDEE_ID = B.ATTENDEE_ID
WHERE A.SOURCE_TYPE != 'CASINO_SESSION'
AND A.SOURCE_CREATED_AT >= '2025-07-16 15:00:00'
AND A.SOURCE_CREATED_AT < '2025-12-01 15:00:00'
GROUP BY B.GP_ID, TO_DATE(TIMESTAMPADD(hour, -15, A.SOURCE_CREATED_AT))
)
SELECT
sr.TARGET_DATE,
p.POOL_GROUP_ID,
p.PVI_Category,
COUNT(DISTINCT p.GP_ID) AS TOTAL_GP_ID_COUNT,
COUNT(DISTINCT CASE WHEN ROUND(ABS(sr.TOTAL_V_RAKE - (CAST(ss.TOTAL_SOURCE_VALUE AS DECIMAL(18, 2)) / 100)), 2) = 0 THEN p.GP_ID END) AS ZERO_GPID_CT,
SUM(sr.TOTAL_V_RAKE) AS TOTAL_V_RAKE,
SUM(CAST(ss.TOTAL_SOURCE_VALUE AS DECIMAL(18, 2)) / 100) AS TOTAL_POINTS,
ROUND(ABS(SUM(sr.TOTAL_V_RAKE) - SUM(CAST(ss.TOTAL_SOURCE_VALUE AS DECIMAL(18, 2)) / 100)), 2) AS TOTAL_POINT_DIFF
FROM PVI_CATEGORIZED p
INNER JOIN SESSION_RAKE sr ON p.GP_ID = sr.GP_ID
INNER JOIN SOURCE_SUM ss ON p.GP_ID = ss.GP_ID AND sr.TARGET_DATE = ss.TARGET_DATE
WHERE sr.TOTAL_V_RAKE IS NOT NULL AND ss.TOTAL_SOURCE_VALUE IS NOT NULL AND sr.TARGET_DATE >= '{{ start_date }}' AND sr.TARGET_DATE < '{{ end_date }}'
GROUP BY sr.TARGET_DATE, p.POOL_GROUP_ID, p.PVI_Category
ORDER BY sr.TARGET_DATE, p.POOL_GROUP_ID, p.PVI_Category;

| [SQL] 글로벌 게임 플랫폼 데이터 기반 Poker GGR 산출 로직 표준화 및 SQL 조회 가이드 구축 (0) | 2026.03.05 |
|---|---|
| [SQL] 글로벌 게임 플랫폼 플레이어 지표 및 GGR 조회 구조 설계 (0) | 2026.03.05 |
| [QA/자동화] 데이터 정합성 자동 검증 대시보드 구축 (0) | 2026.03.05 |
| MySQL 이벤트 스케쥴러 생성 (0) | 2025.05.09 |