dau_commercial_impact_template.sql 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. -- ${bizdate} DAU安全行为累计分五档及当日分享/回流贡献
  2. -- 得分窗口:${history_start_dt}-${history_end_dt},不包含统计日
  3. -- S = 有效播放次数 + ${active_weight} * 活跃天数 + 分享次数
  4. -- + 50 * I(窗口内出现过1067或1095来源场景)
  5. -- 分位点按${bizdate} DAU用户人数从低分到高分计算,同分用户保持同档。
  6. WITH dau AS (
  7. SELECT DISTINCT machinecode AS mid
  8. FROM loghubods.useractive_log
  9. WHERE dt = '${bizdate}'
  10. AND businesstype = 'path'
  11. AND machinecode IS NOT NULL
  12. AND machinecode <> ''
  13. ),
  14. history_active AS (
  15. SELECT
  16. a.machinecode AS mid,
  17. COUNT(DISTINCT a.dt) AS active_day_cnt
  18. FROM loghubods.useractive_log a
  19. JOIN dau d
  20. ON a.machinecode = d.mid
  21. WHERE a.dt BETWEEN '${history_start_dt}' AND '${history_end_dt}'
  22. AND a.businesstype = 'path'
  23. GROUP BY a.machinecode
  24. ),
  25. history_real_play AS (
  26. SELECT
  27. p.mid,
  28. COUNT(*) AS real_play_cnt
  29. FROM loghubods.video_play_log p
  30. JOIN dau d
  31. ON p.mid = d.mid
  32. WHERE p.dt BETWEEN '${history_start_dt}' AND '${history_end_dt}'
  33. AND p.businesstype = 'videoRealPlay'
  34. GROUP BY p.mid
  35. ),
  36. history_share AS (
  37. SELECT
  38. v.mid,
  39. COUNT(*) AS share_cnt
  40. FROM loghubods.video_action_log_applet v
  41. JOIN dau d
  42. ON v.mid = d.mid
  43. WHERE v.dt BETWEEN '${history_start_dt}' AND '${history_end_dt}'
  44. AND v.business = 'videoShareFriend'
  45. AND v.businesstype = 'videoShareFriend'
  46. GROUP BY v.mid
  47. ),
  48. history_paid_source AS (
  49. SELECT
  50. s.machinecode AS mid,
  51. 1 AS has_paid_source
  52. FROM loghubods.user_share_log s
  53. JOIN dau d
  54. ON s.machinecode = d.mid
  55. WHERE s.dt BETWEEN '${history_start_dt}' AND '${history_end_dt}'
  56. AND s.topic = 'click'
  57. AND s.hotsencetype IN ('1067', '1095')
  58. GROUP BY s.machinecode
  59. ),
  60. user_score AS (
  61. SELECT
  62. d.mid,
  63. COALESCE(p.real_play_cnt, 0) AS real_play_cnt,
  64. COALESCE(a.active_day_cnt, 0) AS active_day_cnt,
  65. COALESCE(s.share_cnt, 0) AS history_share_cnt,
  66. COALESCE(x.has_paid_source, 0) AS has_paid_source,
  67. COALESCE(p.real_play_cnt, 0)
  68. + ${active_weight} * COALESCE(a.active_day_cnt, 0)
  69. + COALESCE(s.share_cnt, 0)
  70. + CASE WHEN COALESCE(x.has_paid_source, 0) = 1 THEN 50 ELSE 0 END
  71. AS safety_score
  72. FROM dau d
  73. LEFT JOIN history_active a
  74. ON d.mid = a.mid
  75. LEFT JOIN history_real_play p
  76. ON d.mid = p.mid
  77. LEFT JOIN history_share s
  78. ON d.mid = s.mid
  79. LEFT JOIN history_paid_source x
  80. ON d.mid = x.mid
  81. ),
  82. score_counts AS (
  83. SELECT safety_score, COUNT(*) AS score_uv
  84. FROM user_score
  85. GROUP BY safety_score
  86. ),
  87. score_cumulative AS (
  88. SELECT
  89. safety_score,
  90. score_uv,
  91. SUM(score_uv) OVER (
  92. ORDER BY safety_score
  93. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  94. ) AS cumulative_uv,
  95. SUM(score_uv) OVER () AS total_uv
  96. FROM score_counts
  97. ),
  98. thresholds AS (
  99. SELECT
  100. MIN(CASE WHEN cumulative_uv >= total_uv * 0.20 THEN safety_score END) AS p20_score,
  101. MIN(CASE WHEN cumulative_uv >= total_uv * 0.40 THEN safety_score END) AS p40_score,
  102. MIN(CASE WHEN cumulative_uv >= total_uv * 0.60 THEN safety_score END) AS p60_score,
  103. MIN(CASE WHEN cumulative_uv >= total_uv * 0.80 THEN safety_score END) AS p80_score,
  104. MAX(total_uv) AS total_dau
  105. FROM score_cumulative
  106. ),
  107. scored_dau AS (
  108. SELECT
  109. u.*,
  110. CASE
  111. WHEN u.safety_score > t.p80_score THEN 1
  112. WHEN u.safety_score > t.p60_score THEN 2
  113. WHEN u.safety_score > t.p40_score THEN 3
  114. WHEN u.safety_score > t.p20_score THEN 4
  115. ELSE 5
  116. END AS band_order
  117. FROM user_score u
  118. CROSS JOIN thresholds t
  119. ),
  120. score_bands AS (
  121. SELECT 1 AS band_order, '安全得分头部20%' AS quantile_band
  122. UNION ALL
  123. SELECT 2 AS band_order, '安全得分20%-40%' AS quantile_band
  124. UNION ALL
  125. SELECT 3 AS band_order, '安全得分40%-60%' AS quantile_band
  126. UNION ALL
  127. SELECT 4 AS band_order, '安全得分60%-80%' AS quantile_band
  128. UNION ALL
  129. SELECT 5 AS band_order, '安全得分尾部20%' AS quantile_band
  130. ),
  131. daily_share_by_mid AS (
  132. SELECT
  133. v.mid,
  134. COUNT(*) AS share_cnt
  135. FROM loghubods.video_action_log_applet v
  136. JOIN dau d
  137. ON v.mid = d.mid
  138. WHERE v.dt = '${bizdate}'
  139. AND v.business = 'videoShareFriend'
  140. AND v.businesstype = 'videoShareFriend'
  141. GROUP BY v.mid
  142. ),
  143. daily_ad_exposure_mids AS (
  144. SELECT DISTINCT
  145. a.machinecode AS mid
  146. FROM loghubods.ad_action_log_own a
  147. JOIN dau d
  148. ON a.machinecode = d.mid
  149. WHERE a.dt = '${bizdate}'
  150. AND a.businesstype = 'adView'
  151. AND a.ownAdSystemType = 'ownPlatform'
  152. ),
  153. daily_ad_click_events AS (
  154. SELECT DISTINCT
  155. a.machinecode AS mid,
  156. a.pqtid
  157. FROM loghubods.ad_action_log_own a
  158. JOIN dau d
  159. ON a.machinecode = d.mid
  160. WHERE a.dt = '${bizdate}'
  161. AND a.businesstype = 'adClick'
  162. AND a.ownAdSystemType = 'ownPlatform'
  163. ),
  164. daily_ad_click_mids AS (
  165. SELECT DISTINCT mid
  166. FROM daily_ad_click_events
  167. ),
  168. daily_conversion_pqtids AS (
  169. SELECT DISTINCT pqtid
  170. FROM loghubods.ad_own_open_conv
  171. WHERE dt = '${bizdate}'
  172. AND pqtid IS NOT NULL
  173. AND pqtid <> ''
  174. ),
  175. daily_converted_mids AS (
  176. SELECT DISTINCT c.mid
  177. FROM daily_ad_click_events c
  178. JOIN daily_conversion_pqtids o
  179. ON c.pqtid = o.pqtid
  180. WHERE c.pqtid IS NOT NULL
  181. AND c.pqtid <> ''
  182. ),
  183. band_user_metrics AS (
  184. SELECT
  185. u.band_order,
  186. COUNT(*) AS visit_uv,
  187. SUM(COALESCE(s.share_cnt, 0)) AS band_share_cnt,
  188. SUM(CASE WHEN e.mid IS NULL THEN 1 ELSE 0 END) AS no_ad_exposure_uv,
  189. SUM(CASE WHEN c.mid IS NOT NULL THEN 1 ELSE 0 END) AS ad_click_uv,
  190. SUM(CASE WHEN x.mid IS NOT NULL THEN 1 ELSE 0 END) AS converted_uv
  191. FROM scored_dau u
  192. LEFT JOIN daily_share_by_mid s
  193. ON u.mid = s.mid
  194. LEFT JOIN daily_ad_exposure_mids e
  195. ON u.mid = e.mid
  196. LEFT JOIN daily_ad_click_mids c
  197. ON u.mid = c.mid
  198. LEFT JOIN daily_converted_mids x
  199. ON u.mid = x.mid
  200. GROUP BY u.band_order
  201. ),
  202. daily_clicks AS (
  203. SELECT
  204. shareid,
  205. machinecode AS return_mid
  206. FROM loghubods.user_share_log
  207. WHERE dt = '${bizdate}'
  208. AND topic = 'click'
  209. AND shareid IS NOT NULL
  210. AND shareid <> ''
  211. AND machinecode IS NOT NULL
  212. AND machinecode <> ''
  213. ),
  214. daily_source_shares AS (
  215. SELECT DISTINCT
  216. s.shareid,
  217. u.band_order
  218. FROM loghubods.user_share_log s
  219. JOIN scored_dau u
  220. ON s.machinecode = u.mid
  221. WHERE s.dt = '${bizdate}'
  222. AND s.topic = 'share'
  223. AND s.shareid IS NOT NULL
  224. AND s.shareid <> ''
  225. ),
  226. band_share_return AS (
  227. SELECT
  228. s.band_order,
  229. COUNT(DISTINCT c.return_mid) AS band_same_day_share_return_uv
  230. FROM daily_source_shares s
  231. JOIN daily_clicks c
  232. ON s.shareid = c.shareid
  233. GROUP BY s.band_order
  234. ),
  235. daily_totals AS (
  236. SELECT
  237. (SELECT COUNT(*) FROM dau) AS total_dau,
  238. (SELECT COALESCE(SUM(share_cnt), 0) FROM daily_share_by_mid) AS total_share_cnt,
  239. (SELECT COUNT(DISTINCT return_mid) FROM daily_clicks) AS total_return_uv,
  240. (
  241. SELECT COUNT(*)
  242. FROM dau d
  243. LEFT JOIN daily_ad_exposure_mids e
  244. ON d.mid = e.mid
  245. WHERE e.mid IS NULL
  246. ) AS total_no_ad_exposure_uv,
  247. (SELECT COUNT(*) FROM daily_ad_click_mids) AS total_ad_click_uv,
  248. (SELECT COUNT(*) FROM daily_converted_mids) AS total_converted_uv,
  249. (
  250. SELECT COUNT(DISTINCT c.return_mid)
  251. FROM daily_source_shares s
  252. JOIN daily_clicks c
  253. ON s.shareid = c.shareid
  254. ) AS total_same_day_share_return_uv
  255. )
  256. SELECT
  257. '${bizdate}' AS dt,
  258. b.quantile_band AS `安全分分位点`,
  259. CASE
  260. WHEN b.band_order = 1 THEN CONCAT('S > ', CAST(t.p80_score AS STRING))
  261. WHEN b.band_order = 2 THEN CONCAT(
  262. CAST(t.p60_score AS STRING), ' < S <= ', CAST(t.p80_score AS STRING)
  263. )
  264. WHEN b.band_order = 3 THEN CONCAT(
  265. CAST(t.p40_score AS STRING), ' < S <= ', CAST(t.p60_score AS STRING)
  266. )
  267. WHEN b.band_order = 4 THEN CONCAT(
  268. CAST(t.p20_score AS STRING), ' < S <= ', CAST(t.p40_score AS STRING)
  269. )
  270. ELSE CONCAT('S <= ', CAST(t.p20_score AS STRING))
  271. END AS score,
  272. t.p20_score AS p20_score,
  273. t.p40_score AS p40_score,
  274. t.p60_score AS p60_score,
  275. t.p80_score AS p80_score,
  276. d.total_dau AS `DAU(当天日活总数)`,
  277. COALESCE(m.visit_uv, 0) AS `访问UV(每个分位点对应人数)`,
  278. COALESCE(m.visit_uv, 0) * 1.0 / NULLIF(d.total_dau, 0) AS `访问UV占比`,
  279. d.total_share_cnt AS `当日总分享次数`,
  280. COALESCE(m.band_share_cnt, 0) AS `分享次数(每个分位点对应次数)`,
  281. d.total_return_uv AS `当日总回流`,
  282. COALESCE(m.band_share_cnt, 0) * 1.0 / NULLIF(d.total_share_cnt, 0) AS `分享次数占比`,
  283. d.total_same_day_share_return_uv AS `当日分享当日回流总人数`,
  284. COALESCE(r.band_same_day_share_return_uv, 0) AS `当日分享当日回流(各分位点人数)`,
  285. COALESCE(r.band_same_day_share_return_uv, 0) * 1.0
  286. / NULLIF(d.total_same_day_share_return_uv, 0) AS `当日分享当日回流人数占比`,
  287. d.total_no_ad_exposure_uv AS `总广告无曝光人数`,
  288. COALESCE(m.no_ad_exposure_uv, 0) AS `无广告曝光人数`,
  289. COALESCE(m.no_ad_exposure_uv, 0) * 1.0
  290. / NULLIF(d.total_no_ad_exposure_uv, 0) AS `无广告曝光人数占比`,
  291. d.total_ad_click_uv AS `总点击人数`,
  292. COALESCE(m.ad_click_uv, 0) AS `点击人数`,
  293. COALESCE(m.ad_click_uv, 0) * 1.0
  294. / NULLIF(d.total_ad_click_uv, 0) AS `点击人数占比`,
  295. d.total_converted_uv AS `总已转化人数`,
  296. COALESCE(m.converted_uv, 0) AS `已转化人数`,
  297. COALESCE(m.converted_uv, 0) * 1.0
  298. / NULLIF(d.total_converted_uv, 0) AS `已转化人数占比`
  299. FROM score_bands b
  300. CROSS JOIN thresholds t
  301. CROSS JOIN daily_totals d
  302. LEFT JOIN band_user_metrics m
  303. ON b.band_order = m.band_order
  304. LEFT JOIN band_share_return r
  305. ON b.band_order = r.band_order
  306. ORDER BY b.band_order;