0. 背景
后台 SP 漏斗有 2 个核心报表页:
| 页面 | 路由 | 取数源 | 主键 |
| 概览页 | sp-user-monetization-daily-performance-overview | soar_dw.rpt_sp_user_monetization_daily_performance_summary_d | (date, platform, country, store_type) |
| 按 store 拆分页 | sp-user-monetization-daily-performance-segment-by-store | soar_dw.rpt_sp_user_monetization_daily_performance_d | (date, store, platform, country, store_type) |
现状缺口:
- AT 失败补贴:用户点了 AT 但试码全失败时,发
reason=220 到钱包,但这部分用户没被 at_test_success_user_cnt 算进去 → 实际 AT 价值兑现率被低估
- CB Unclaimed:订单已产生但还未结算的 cashback,在
dwd_trd_order_cashback_det_d 之外(在 v_dwd_trd_order_unclaimed_cashback_detail_df),目前完全没纳入 cb_service_success_user_cnt
- 悬浮球(XF / FloatWin):曝光/点击数据在
v_dwd_cp_log_impress_other_log_di,与 dws_log_domain_guid_extension_impress_kpis_d 不同表,目前 summary 报表没有这部分
→ 需要在两张报表表里新增 5 个字段,让后台能看完整的"价值兑现 + 悬浮球"数据。
1. 新增字段清单(共 5 个)
| # | 字段名 | 含义 | 类型 | 加入表 |
| 1 | at_test_success_user_cnt_with_subsidy | AT 试码成功 ∪ AT 失败补贴(reason=220)去重 user 数 | bigint | summary + detail |
| 2 | cb_service_success_user_cnt_with_unclaimed | CB 已结算 ∪ CB Unclaimed 去重 user 数 | bigint | summary + detail |
| 3 | service_success_user_cnt_with_boost | (AT 试码成功 ∪ AT 补贴 ∪ CB 已结算 ∪ CB Unclaimed) 去重 user 数 | bigint | summary + detail |
| 4 | xf_impr_user_cnt | 悬浮球(FloatWin_Icon)曝光去重 user 数 | bigint | summary + detail |
| 5 | xf_click_user_cnt | 悬浮球(XF/FloatWin)点击去重 user 数 | bigint | summary + detail |
配套(可选,方便算 CTR):xf_impr_cnt(PV,曝光次数不去重)、xf_click_cnt(PV,点击次数不去重)
2. 字段 1:at_test_success_user_cnt_with_subsidy
定义
(AT 试码成功 user)∪(AT 失败补贴 user)去重 count
SQL 实现
INSERT INTO rpt_sp_user_monetization_daily_performance_summary_d
(date, platform, country, store_type, at_test_success_user_cnt_with_subsidy)
SELECT date,
coalesce(platform,'ALL') AS platform,
coalesce(country,'ALL') AS country,
store_type,
count(distinct t1.guid) AS at_test_success_user_cnt_with_subsidy
FROM sp_guids t1
JOIN (
-- 路径 A: AT 试码成功(沿用现有 ETL 行 481-526 口径)
SELECT DISTINCT
client_id AS guid, domain, pt,
'is_at_test' AS type
FROM v_dwd_log_parse_testing_log_di
WHERE pt >= '${before30d_date}' AND pt < '${end_date}'
AND source = 1 AND business = 1
AND (get_json_string(extra,'$.clicked_from') != 'Auto_Testing'
OR get_json_string(extra,'$.clicked_from') IS NULL)
AND get_json_object(extra,'$.clicked_from') != 'ATAutoSaved_Popup'
AND (saved_amount > 0 OR (save_type > 0 AND save_type < 100))
UNION ALL
-- 路径 B: AT 失败补贴(新增)
-- wallet_log 没 domain,补贴只能按 (guid, pt) 关联 sp_guids
SELECT DISTINCT
gm.guid AS guid,
NULL AS domain, -- 补贴无 domain 维度
date(w.created_at) AS pt,
'is_at_subsidy' AS type
FROM dwd_user_wallet_log_d w
JOIN dwd_user_guid_map_df gm ON gm.user_id = w.user_id
WHERE date(w.created_at) >= '${before30d_date}'
AND date(w.created_at) < '${end_date}'
AND w.reason = '220'
) t2
ON t1.guid = t2.guid
AND t1.date = t2.pt
AND (t1.domain = t2.domain OR t2.domain IS NULL) -- 补贴放宽到 (guid, date)
GROUP BY grouping sets (
(date, store_type, platform, country),
(date, store_type, platform),
(date, store_type, country),
(date, store_type)
);
验证数据(2026-05-10 AFF_SP_CPS_STORE)
| 指标 | 数值 |
现有 at_test_success_user_cnt | 7,788 |
| AT 补贴 ∩ AFF_SP_CPS SP user | 37 |
| 重叠 | ≈ 0(补贴专给试码失败者,与 success 互斥) |
| 预期新字段 | ≈ 7,825(+37 / +0.47%) |
3. 字段 2:cb_service_success_user_cnt_with_unclaimed
定义
(CB 已结算 user)∪(CB Unclaimed user)去重 count
SQL 实现
INSERT INTO rpt_sp_user_monetization_daily_performance_summary_d
(date, platform, country, store_type, cb_service_success_user_cnt_with_unclaimed)
SELECT date,
coalesce(platform,'ALL') AS platform,
coalesce(country,'ALL') AS country,
store_type,
count(distinct t1.guid) AS cb_service_success_user_cnt_with_unclaimed
FROM sp_guids t1
JOIN (
-- 路径 A: CB 已结算(沿用现有 ETL 行 509-516 口径,含 g7k2_guid 反推)
SELECT DISTINCT
CASE WHEN coalesce(guid,'') = '' THEN get_json_object(extra,'$.g7k2_guid')
ELSE guid END AS guid,
domain,
date(ordered_at) AS pt,
'is_cashback' AS type
FROM dwd_trd_order_cashback_det_d
WHERE ordered_at >= '${before30d_date}'
AND ordered_at < '${end_date}'
UNION ALL
-- 路径 B: CB Unclaimed(新增)
SELECT DISTINCT
guid, domain,
date(ordered_at) AS pt,
'is_unclaimed' AS type
FROM v_dwd_trd_order_unclaimed_cashback_detail_df
WHERE ordered_at >= '${before30d_date}'
AND ordered_at < '${end_date}'
AND cashback_status IN (1, 3) -- 1=pending, 3=expired
) t2
ON t1.domain = t2.domain
AND t1.date = t2.pt
AND t1.guid = t2.guid
GROUP BY grouping sets (
(date, store_type, platform, country),
(date, store_type, platform),
(date, store_type, country),
(date, store_type)
);
验证数据(2026-05-10 AFF_SP_CPS_STORE)
| 指标 | 数值 |
现有 cb_service_success_user_cnt | 7,545 |
| CB Unclaimed ∩ AFF_SP_CPS SP user(三键 match) | 1,825 |
| CB Unclaimed ∩ CB Success 重叠 | 171(9.4%) |
| 预期新字段 | ≈ 9,199(+1,654 / +21.9%) |
CB Success Rate 变化预期
| 计算 | 结果 |
| 旧 Rate | cb_succ / cb_svc_clk = 7,545 / 10,807 | 69.82% |
| 新 Rate(含 Unclaimed) | 9,199 / 10,807 | 85.12%(+15.30pp) |
4. 字段 3:service_success_user_cnt_with_boost
定义
所有"价值兑现"的去重 user:(AT Success ∪ AT 补贴 ∪ CB Success ∪ CB Unclaimed)
SQL 实现
INSERT INTO rpt_sp_user_monetization_daily_performance_summary_d
(date, platform, country, store_type, service_success_user_cnt_with_boost)
SELECT date,
coalesce(platform,'ALL') AS platform,
coalesce(country,'ALL') AS country,
store_type,
count(distinct t1.guid) AS service_success_user_cnt_with_boost
FROM sp_guids t1
JOIN (
-- 4 个 UNION ALL(复用字段 1/2 的子查询)
SELECT client_id AS guid, domain, pt, 'is_at_test' AS type
FROM v_dwd_log_parse_testing_log_di
WHERE pt >= '${before30d_date}' AND pt < '${end_date}'
AND source = 1 AND business = 1
AND (saved_amount > 0 OR (save_type > 0 AND save_type < 100))
UNION ALL
SELECT gm.guid, NULL AS domain, date(w.created_at), 'is_at_subsidy'
FROM dwd_user_wallet_log_d w
JOIN dwd_user_guid_map_df gm ON gm.user_id = w.user_id
WHERE w.reason = '220'
UNION ALL
SELECT CASE WHEN coalesce(guid,'') = '' THEN get_json_object(extra,'$.g7k2_guid')
ELSE guid END, domain, date(ordered_at), 'is_cashback'
FROM dwd_trd_order_cashback_det_d
WHERE ordered_at >= '${before30d_date}' AND ordered_at < '${end_date}'
UNION ALL
SELECT guid, domain, date(ordered_at), 'is_unclaimed'
FROM v_dwd_trd_order_unclaimed_cashback_detail_df
WHERE ordered_at >= '${before30d_date}' AND ordered_at < '${end_date}'
AND cashback_status IN (1, 3)
) t2
ON t1.guid = t2.guid AND t1.date = t2.pt
AND (t1.domain = t2.domain OR t2.domain IS NULL)
GROUP BY grouping sets (
(date, store_type, platform, country),
(date, store_type, platform),
(date, store_type, country),
(date, store_type)
);
验证数据(2026-05-10 AFF_SP_CPS_STORE)
| 指标 | 数值 |
现有 service_success_user_cnt | 13,534 |
| 加补贴 + Unclaimed 后预期 | ≈ 14,800–15,200(具体看 AT 和 CB 重叠) |
| Service Success Rate 变化 | 63.84% → ~70–72% |
5. 字段 4+5:悬浮球(XF)曝光 + 点击
取数源
| 类型 | 数据源 | 过滤条件 |
| 曝光 | v_dwd_cp_log_impress_other_log_di | category='float_win' AND label='FloatWin_Icon' AND action='impression' |
| 点击 | dwd_log_v2_parse_extension_service_click_di | click_type='XF' AND scene='FloatWin' |
统一前提:XF 字段也要 JOIN sp_guids 三键 (date, guid, domain) 限定在 SP 用户当天该商家范围内,与 AT/CB 字段口径完全一致。
字段定义
| 字段 | 含义 | SQL |
xf_impr_cnt | 悬浮球曝光次数(PV) | COUNT(*) |
xf_impr_user_cnt | 悬浮球曝光去重 user | COUNT(DISTINCT guid) |
xf_click_cnt | 悬浮球点击次数 | COUNT(*) |
xf_click_user_cnt | 悬浮球点击去重 user | COUNT(DISTINCT guid) |
SQL 实现(曝光)
INSERT INTO rpt_sp_user_monetization_daily_performance_summary_d
(date, platform, country, store_type, xf_impr_user_cnt, xf_impr_cnt)
SELECT date,
coalesce(platform,'ALL') AS platform,
coalesce(country,'ALL') AS country,
store_type,
count(distinct t1.guid) AS xf_impr_user_cnt,
count(*) AS xf_impr_cnt
FROM sp_guids t1
JOIN (
SELECT guid, domain, date(pt) AS pt
FROM v_dwd_cp_log_impress_other_log_di
WHERE pt >= '${before30d_date}' AND pt < '${end_date}'
AND category = 'float_win'
AND label = 'FloatWin_Icon'
AND action = 'impression'
) t2
ON t1.domain = t2.domain
AND t1.date = t2.pt
AND t1.guid = t2.guid
GROUP BY grouping sets (
(date, store_type, platform, country),
(date, store_type, platform),
(date, store_type, country),
(date, store_type)
);
SQL 实现(点击)
INSERT INTO rpt_sp_user_monetization_daily_performance_summary_d
(date, platform, country, store_type, xf_click_user_cnt, xf_click_cnt)
SELECT date,
coalesce(platform,'ALL') AS platform,
coalesce(country,'ALL') AS country,
store_type,
count(distinct t1.guid) AS xf_click_user_cnt,
count(*) AS xf_click_cnt
FROM sp_guids t1
JOIN (
SELECT guid, domain, pt
FROM dwd_log_v2_parse_extension_service_click_di
WHERE pt >= '${before30d_date}' AND pt < '${end_date}'
AND click_type = 'XF'
AND scene = 'FloatWin'
) t2
ON t1.domain = t2.domain
AND t1.date = t2.pt
AND t1.guid = t2.guid
GROUP BY grouping sets (
(date, store_type, platform, country),
(date, store_type, platform),
(date, store_type, country),
(date, store_type)
);
⚠️ 数据源字段确认事项(请数仓同学确认)
1. v_dwd_cp_log_impress_other_log_di 是否有 guid 字段?还是 client_id?若是 client_id 需 alias 后再 JOIN
2. 是否有 domain 字段?还是要从 extra 提取?
3. dwd_log_v2_parse_extension_service_click_di 的关联字段是否直接可用 guid 和 domain?
6. detail 表(segment-by-store)同步加字段
detail 表 rpt_sp_user_monetization_daily_performance_d 使用同一份 sp_guids,只是 grouping sets 多了 store(domain)维度。
grouping sets 改动
GROUP BY grouping sets (
(date, t1.domain, store_type, platform, country),
(date, t1.domain, store_type, platform),
(date, t1.domain, store_type, country),
(date, t1.domain, store_type)
)
字段类型、SQL 逻辑与 summary 表完全一致,只是按 store 切分输出。
7. 后台展示需求(前端)
概览页 — 在现有 Success 区块下方新增指标卡
| 指标 | 显示 | 字段 |
| AT Test Success Cnt(含补贴) | 数字 + 同比 | at_test_success_user_cnt_with_subsidy |
| AT Test Success Rate(含补贴) | 百分比 | at_test_success_user_cnt_with_subsidy / at_service_click_user_cnt |
| CB Service Success Cnt(含 Unclaimed) | 数字 + 同比 | cb_service_success_user_cnt_with_unclaimed |
| CB Service Success Rate(含 Unclaimed) | 百分比 | cb_service_success_user_cnt_with_unclaimed / cb_service_click_user_cnt |
| Service Success Cnt(含 boost) | 数字 + 同比 | service_success_user_cnt_with_boost |
| Service Success Rate(含 boost) | 百分比 | service_success_user_cnt_with_boost / service_click_user_cnt |
概览页 — 新增"悬浮球"区块
| 指标 | 显示 | 字段 |
| XF 曝光 user | 数字 | xf_impr_user_cnt |
| XF 点击 user | 数字 | xf_click_user_cnt |
| XF CTR | 百分比 | xf_click_user_cnt / xf_impr_user_cnt |
| XF 曝光 PV | 数字(次要) | xf_impr_cnt |
| XF 点击 PV | 数字(次要) | xf_click_cnt |
segment-by-store 页
每个 store 一行,新增同样 5 个字段列。
8. ETL 时延注意事项
| 数据源 | 时延 | 影响 |
dwd_user_wallet_log_d reason=220 | 1 天内 | AT 补贴基本实时 |
dwd_trd_order_cashback_det_d | 2–7 天 | CB Success 历史数据 |
v_dwd_trd_order_unclaimed_cashback_detail_df | 1–3 天 | CB Unclaimed 较快 |
v_dwd_cp_log_impress_other_log_di | T+1 | XF 曝光 |
dwd_log_v2_parse_extension_service_click_di | T+1 | XF 点击 |
建议:summary/detail 表保持现有 T+1 跑批节奏;CB 类字段靠现有 30d 回滚机制逐步成熟。
9. 上线步骤建议
数仓侧(owner: 数据团队)
- 在 summary + detail 表加 5 个字段(DDL)
- 改 ETL SQL,按上面逻辑回灌近 30 天历史数据
- 跟 PM 对 5-10 验证数据(at_subsidy ≈ 37, cb_unclaimed ≈ 1,825)
后端侧(owner: 后端)
SPUserMonetizationDailyController 把新字段加入 response
前端侧(owner: 前端)
- overview 页加 3 个指标卡 + 悬浮球区块
- segment-by-store 页加 5 列
10. 验收标准
| 验证项 | 标准 |
5-10 数据 at_test_success_user_cnt_with_subsidy | ≈ 7,825(±5) |
5-10 数据 cb_service_success_user_cnt_with_unclaimed | ≈ 9,200(±50) |
| 5-10 数据 CB Success Rate 含 Unclaimed | 85.12% ± 1pp |
| XF 曝光 user 数 | 与现有 BI dashboard(XF 悬浮球面板)对齐 |
联系人:chensu / suchen9209@gmail.com |
备注:核心思路源于 PRD project_coupert_sp_no_click_FINAL.md v9.1 中"价值兑现率"分析的延伸。