dau_全维度.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. -- 分 apptype × 尾号 × 内外 × 来源大类 × 回流天数 × 微信场景 × AB 实验 DAU
  2. -- 基于 useractive_log 单表,无 JOIN
  3. --
  4. -- 7 个维度(含 dt),核心是 user_class 6 分类 + share_age_bucket 回流时长
  5. -- GROUPING SETS 精选了 8 组常用切片(不是全组合,避免行数爆炸)
  6. --
  7. -- 来源大类 user_class:
  8. -- A_外部投放拉来 : 本次被外部投放素材拉来(shareId 是 GUID 格式)
  9. -- B_用户分享_链根外部 : 被用户分享拉来 + 链根来自外部投放
  10. -- C_用户分享_链根内部 : 被用户分享拉来 + 链根是自然打开用户
  11. -- D_主动回流(外部血统) : 本次主动启动 + 有外部回流残留
  12. -- E_主动回流(分享残留) : 本次主动启动 + 仅有分享残留
  13. -- F_纯主动 : 真正凭记忆主动打开
  14. --
  15. -- 回流天数 share_age_bucket(仅对 B/C 有意义):
  16. -- d0 当天 / d1 1天前 / d2_7 2-7天前 / d8_30 8-30天前 / d30plus >30天前
  17. WITH t_base AS
  18. (
  19. SELECT dt
  20. ,apptype
  21. ,machinecode
  22. ,sessionid
  23. ,subsessionid
  24. ,clienttimestamp
  25. ,sencetype
  26. ,params
  27. ,GET_JSON_OBJECT(extparams,'$.rootSessionId') AS rsid
  28. ,GET_JSON_OBJECT(extparams,'$.rootSourceId') AS rscid
  29. ,GET_JSON_OBJECT(extparams,'$.eventInfos.ab_test003') AS ab003
  30. ,SPLIT_PART(SPLIT_PART(params, 'shareId=', 2), '&', 1) AS share_id
  31. FROM loghubods.useractive_log
  32. WHERE dt = "${dt}"
  33. AND businesstype = 'path'
  34. AND GET_JSON_OBJECT(extparams,'$.rootSessionId') IS NOT NULL
  35. AND GET_JSON_OBJECT(extparams,'$.rootSessionId') <> ''
  36. ),
  37. t_derived AS
  38. (
  39. SELECT dt
  40. ,apptype
  41. ,machinecode
  42. ,COALESCE(ab003, 'unknown') AS ab003
  43. ,SUBSTR(rsid, LENGTH(rsid), 1) AS suffix
  44. -- 内/外二分(保留原口径,跟旧 SQL 对齐)
  45. ,CASE
  46. WHEN rscid IS NOT NULL AND rscid <> '' THEN '外部'
  47. ELSE '内部'
  48. END AS source_type
  49. -- 微信场景大类(避免 cardinality 爆炸,归 6 类)
  50. ,CASE sencetype
  51. WHEN '1007' THEN '1007_单聊'
  52. WHEN '1008' THEN '1008_群聊'
  53. WHEN '1014' THEN '1014_朋友圈'
  54. WHEN '1044' THEN '1044_群消息卡片'
  55. WHEN '1154' THEN '1154_视频号'
  56. WHEN '1001' THEN '1001_主入口'
  57. ELSE 'other'
  58. END AS scene_grp
  59. -- 投放渠道前缀(rootSourceId 不为空时才有意义)
  60. ,CASE
  61. WHEN rscid LIKE 'touliu_tencent%' THEN 'ch_touliu_tencent'
  62. WHEN rscid LIKE 'dyyqw_%' THEN 'ch_dyyqw'
  63. WHEN rscid LIKE 'dyyjs_%' THEN 'ch_dyyjs'
  64. WHEN rscid LIKE '%GzhArticle%'
  65. OR rscid LIKE 'DaiTou_gh_%' THEN 'ch_gzh_article'
  66. WHEN rscid IS NULL OR rscid = '' THEN 'ch_none'
  67. ELSE 'ch_other'
  68. END AS channel
  69. -- 用户来源 6 分类
  70. ,CASE
  71. -- 本次被外部投放拉来(shareId GUID 格式)
  72. WHEN params LIKE '%shareId=%'
  73. AND NOT (SUBSTR(share_id, LENGTH(share_id) - INSTR(REVERSE(share_id),'-') + 2)
  74. RLIKE '^[0-9]{13}$')
  75. THEN 'A_外部投放拉来'
  76. -- 本次被用户分享拉来 + 链根外部
  77. WHEN params LIKE '%shareId=%'
  78. AND (rscid IS NOT NULL AND rscid <> '')
  79. THEN 'B_用户分享_链根外部'
  80. -- 本次被用户分享拉来 + 链根内部
  81. WHEN params LIKE '%shareId=%'
  82. THEN 'C_用户分享_链根内部'
  83. -- 主动启动 + 有外部回流残留
  84. WHEN rscid IS NOT NULL AND rscid <> ''
  85. THEN 'D_主动回流_外部血统'
  86. -- 主动启动 + 有分享残留
  87. WHEN rsid <> sessionid AND rsid <> subsessionid
  88. THEN 'E_主动回流_分享残留'
  89. ELSE 'F_纯主动'
  90. END AS user_class
  91. -- 回流天数(仅 shareId 有时间戳时计算)
  92. ,CASE
  93. WHEN params LIKE '%shareId=%'
  94. AND (SUBSTR(share_id, LENGTH(share_id) - INSTR(REVERSE(share_id),'-') + 2)
  95. RLIKE '^[0-9]{13}$')
  96. THEN
  97. CAST((CAST(clienttimestamp AS BIGINT) + 28800000) / 86400000 AS BIGINT)
  98. - CAST((CAST(SUBSTR(share_id, LENGTH(share_id) - INSTR(REVERSE(share_id),'-') + 2)
  99. AS BIGINT) + 28800000) / 86400000 AS BIGINT)
  100. ELSE NULL
  101. END AS days_diff
  102. FROM t_base
  103. ),
  104. t_final AS
  105. (
  106. SELECT dt, apptype, machinecode, ab003, suffix, source_type, scene_grp, channel, user_class
  107. ,CASE
  108. WHEN days_diff IS NULL THEN 'na' -- 非分享回流
  109. WHEN days_diff <= 0 THEN 'd0_当天'
  110. WHEN days_diff = 1 THEN 'd1_1天前'
  111. WHEN days_diff BETWEEN 2 AND 7 THEN 'd2_7_一周内'
  112. WHEN days_diff BETWEEN 8 AND 30 THEN 'd8_30_一月内'
  113. ELSE 'd30plus_长尾'
  114. END AS share_age_bucket
  115. FROM t_derived
  116. )
  117. SELECT dt
  118. ,COALESCE(apptype, 'ALL') AS apptype
  119. ,COALESCE(user_class, 'ALL') AS user_class
  120. ,COALESCE(source_type, 'ALL') AS source_type
  121. ,COALESCE(suffix, 'ALL') AS suffix
  122. ,COALESCE(scene_grp, 'ALL') AS scene_grp
  123. ,COALESCE(channel, 'ALL') AS channel
  124. ,COALESCE(ab003, 'ALL') AS ab003
  125. ,COALESCE(share_age_bucket, 'ALL') AS share_age_bucket
  126. ,COUNT(DISTINCT machinecode) AS dau
  127. FROM t_final
  128. GROUP BY dt, apptype, user_class, source_type, suffix, scene_grp, channel, ab003, share_age_bucket
  129. GROUPING SETS (
  130. -- ① 大盘日总量
  131. (dt),
  132. -- ② 大盘 × 来源(最常看)
  133. (dt, user_class),
  134. (dt, source_type),
  135. -- ③ 大盘 × 来源 × 回流时长(衰减曲线)
  136. (dt, user_class, share_age_bucket),
  137. -- ④ 分 apptype 全量 + 分 apptype × 来源
  138. (dt, apptype),
  139. (dt, apptype, user_class),
  140. (dt, apptype, source_type),
  141. -- ⑤ 尾号实验维度(保留原 SQL 的核心切片)
  142. (dt, apptype, suffix),
  143. (dt, apptype, suffix, source_type),
  144. -- ⑥ 尾号 × AB 实验(验证两套实验体系)
  145. (dt, suffix, ab003),
  146. -- ⑦ 微信场景拆分
  147. (dt, scene_grp),
  148. (dt, apptype, scene_grp, user_class),
  149. -- ⑧ 投放渠道拆分
  150. (dt, channel, user_class),
  151. (dt, apptype, channel)
  152. )