数仓需求:SP Monetization 报表加 4 类新字段

提出人chensu(Coupert PM)
日期2026-05-25
优先级
影响范围2 张报表 + 后台 2 个页面
目录
0背景 1新增字段清单(共 5 个) 2字段 1:at_test_success_user_cnt_with_subsidy 3字段 2:cb_service_success_user_cnt_with_unclaimed 4字段 3:service_success_user_cnt_with_boost 5字段 4+5:悬浮球(XF)曝光 + 点击 6detail 表同步加字段 7后台展示需求(前端) 8ETL 时延注意事项 9上线步骤建议 10验收标准
0. 背景

后台 SP 漏斗有 2 个核心报表页:

页面路由取数源主键
概览页sp-user-monetization-daily-performance-overviewsoar_dw.rpt_sp_user_monetization_daily_performance_summary_d(date, platform, country, store_type)
按 store 拆分页sp-user-monetization-daily-performance-segment-by-storesoar_dw.rpt_sp_user_monetization_daily_performance_d(date, store, platform, country, store_type)

现状缺口:

  1. AT 失败补贴:用户点了 AT 但试码全失败时,发 reason=220 到钱包,但这部分用户没被 at_test_success_user_cnt 算进去 → 实际 AT 价值兑现率被低估
  2. CB Unclaimed:订单已产生但还未结算的 cashback,在 dwd_trd_order_cashback_det_d 之外(在 v_dwd_trd_order_unclaimed_cashback_detail_df),目前完全没纳入 cb_service_success_user_cnt
  3. 悬浮球(XF / FloatWin):曝光/点击数据在 v_dwd_cp_log_impress_other_log_di,与 dws_log_domain_guid_extension_impress_kpis_d 不同表,目前 summary 报表没有这部分
→ 需要在两张报表表里新增 5 个字段,让后台能看完整的"价值兑现 + 悬浮球"数据。
1. 新增字段清单(共 5 个)
#字段名含义类型加入表
1at_test_success_user_cnt_with_subsidyAT 试码成功 ∪ AT 失败补贴(reason=220)去重 user 数bigintsummary + detail
2cb_service_success_user_cnt_with_unclaimedCB 已结算 ∪ CB Unclaimed 去重 user 数bigintsummary + detail
3service_success_user_cnt_with_boost(AT 试码成功 ∪ AT 补贴 ∪ CB 已结算 ∪ CB Unclaimed) 去重 user 数bigintsummary + detail
4xf_impr_user_cnt悬浮球(FloatWin_Icon)曝光去重 user 数bigintsummary + detail
5xf_click_user_cnt悬浮球(XF/FloatWin)点击去重 user 数bigintsummary + 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_cnt7,788
AT 补贴 ∩ AFF_SP_CPS SP user37
重叠≈ 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_cnt7,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 变化预期
计算结果
旧 Ratecb_succ / cb_svc_clk = 7,545 / 10,80769.82%
新 Rate(含 Unclaimed)9,199 / 10,80785.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_cnt13,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_dicategory='float_win' AND label='FloatWin_Icon' AND action='impression'
点击dwd_log_v2_parse_extension_service_click_diclick_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悬浮球曝光去重 userCOUNT(DISTINCT guid)
xf_click_cnt悬浮球点击次数COUNT(*)
xf_click_user_cnt悬浮球点击去重 userCOUNT(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 的关联字段是否直接可用 guiddomain
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=2201 天内AT 补贴基本实时
dwd_trd_order_cashback_det_d2–7 天CB Success 历史数据
v_dwd_trd_order_unclaimed_cashback_detail_df1–3 天CB Unclaimed 较快
v_dwd_cp_log_impress_other_log_diT+1XF 曝光
dwd_log_v2_parse_extension_service_click_diT+1XF 点击
建议:summary/detail 表保持现有 T+1 跑批节奏;CB 类字段靠现有 30d 回滚机制逐步成熟。
9. 上线步骤建议
数仓侧(owner: 数据团队)
后端侧(owner: 后端)
前端侧(owner: 前端)
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 含 Unclaimed85.12% ± 1pp
XF 曝光 user 数与现有 BI dashboard(XF 悬浮球面板)对齐
联系人:chensu / suchen9209@gmail.com  |  备注:核心思路源于 PRD project_coupert_sp_no_click_FINAL.md v9.1 中"价值兑现率"分析的延伸。