loghubods.dwd_recsys_alg_exposure_base_20260209.sql 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  1. --@exclude_input=loghubods.video_action_log_flow_new
  2. --@exclude_input=loghubods.user_share_log_flow
  3. -- =====================================================================
  4. -- 曝光回流基础表 (行级, 每行 = 一次曝光)
  5. -- 版本: 20260209 (基于 20260206 重构 B/C/D 链: +sharedepth 维度 + exp/pv/uv/mids)
  6. -- 版本历史: 20250108 → 20260206(+B/C/D) → 20260209(+sharedepth+exp/pv/uv/mids)
  7. -- =====================================================================
  8. --
  9. -- 数据源 (3 张流水表):
  10. -- video_action_log_flow_new → 曝光事件 (businesstype=videoView)
  11. -- user_share_log_flow → 分享事件 (topic=share) + 回流点击 (topic=click)
  12. -- changwen_rootsourceid_group_hour → rootsourceid 分组名映射
  13. --
  14. -- 数据流:
  15. -- 曝光去重 ──→ 分享关联曝光 ──→ 回流关联分享 ──→ B链(直达回流)
  16. -- │ │ │
  17. -- │ └── 回流关联曝光 ─── 1度/n度回流 ├─→ C链(二次传播, BFS 3hop)
  18. -- │ └─→ D链(session内后续曝光传播, BFS 3hop)
  19. -- └── 最终 LEFT JOIN 组装 → 输出行级明细
  20. --
  21. -- CTE 管线:
  22. -- t_return 回流点击去重 (user_share_log_flow topic=click, ROW_NUMBER dedup)
  23. -- t_share_from_sharelog 分享行为去重 (user_share_log_flow topic=share)
  24. -- t_exposure_raw/t_exposure 曝光去重 (video_action_log_flow_new, 分 share/非share 两路 UNION ALL)
  25. -- t_return_exposure_1~4 回流关联曝光: 4 轮渐进放宽 JOIN 条件
  26. -- 1) subsessionid + headvideoid
  27. -- 2) sessionid + headvideoid
  28. -- 3) subsessionid (不限vid)
  29. -- 4) sessionid (不限vid)
  30. -- t_normal_share_exposure_1~6 常规分享关联曝光: 6 轮渐进放宽
  31. -- 1) subsessionid + pagesource + vid, ts>=
  32. -- 2) sessionid + pagesource + vid, ts>=
  33. -- 3) subsessionid + pagesource + vid (无ts)
  34. -- 4) sessionid + pagesource + vid (无ts)
  35. -- 5) subsessionid + vid
  36. -- 6) sessionid + vid
  37. -- t_no_normal_share_exposure_1~4 非常规(detail页)分享关联曝光: 4 轮
  38. -- t_share_return bridge: 分享曝光 × 回流点击 (rootshareid + vid + apptype)
  39. -- B 链 t_exposure_bn (pv/uv/mids) + t_b_exp (exp), 按 sharedepth 拆分
  40. -- C 链 BFS 3hop: frontier_N → t_c_hopN (pv/uv/mids) + t_c_hopN_exp (exp)
  41. -- D 链 BFS 3hop: t_d0(成本) → t_d_hopN + t_d_hopN_exp, frontier anti-join 去环
  42. -- t_share_with_label/_group 分享标签聚合 (1度/n度 pv/uv/mids)
  43. -- t_exposure_share_return 最终 SELECT: LEFT JOIN 组装所有字段
  44. --
  45. -- 关键设计决策:
  46. -- 去环策略: 仅 session 级 anti-join (frontier_N LEFT JOIN 排除已访问 subsessionid)
  47. -- 不做用户级去环 (会丢失 A→B→A→C 中的 C)
  48. -- sharedepth: 来自 user_share_log_flow 的 click topic, CAST(sharedepth AS BIGINT)
  49. -- COLLECT_SET + CASE WHEN: 条件不满足时会加入 NULL, SIZE 需要 COALESCE 兜底
  50. -- =====================================================================
  51. -- drop table if exists loghubods.dwd_recsys_alg_exposure_base_20260209;
  52. CREATE TABLE IF NOT EXISTS loghubods.dwd_recsys_alg_exposure_base_20260209
  53. (
  54. apptype STRING
  55. ,uid STRING
  56. ,mid STRING
  57. ,vid STRING
  58. ,sessionid STRING
  59. ,subsessionid STRING
  60. ,pagesource STRING
  61. ,page STRING
  62. ,recommendlogvo STRING COMMENT '推荐算法的返回结果日志存在这个字段中'
  63. ,abcode STRING COMMENT '推荐算法的ab分组:ab0'
  64. ,recommendpagetype STRING COMMENT '用于区分pagesource相同时某些场景的。三种回流头部;两种下滑-沉浸页下滑和feed下滑。 -pages/user-videos-share-recommend-detail 是沉浸页。'
  65. ,recomtraceid STRING COMMENT '在后端调取推荐服务之前生成。前端降级会空;后端也可能为空。'
  66. ,headvideoid STRING
  67. ,rootsourceid STRING COMMENT '区分touliu等流量,咨询产品。'
  68. ,hotsencetype STRING
  69. ,flowpool STRING COMMENT '非流量池,是空字符串。没有null值。'
  70. ,level STRING COMMENT '非流量池,是null。'
  71. ,clientip STRING
  72. ,machineinfo_brand STRING
  73. ,machineinfo_model STRING
  74. ,machineinfo_system STRING
  75. ,machineinfo_wechatversion STRING
  76. ,machineinfo_sdkversion STRING
  77. ,province STRING
  78. ,city STRING
  79. ,ts STRING
  80. ,is_share STRING
  81. ,share_cnt STRING
  82. ,is_return_1 STRING
  83. ,return_1_pv STRING
  84. ,return_1_uv STRING
  85. ,is_return_n STRING
  86. ,return_n_pv STRING
  87. ,return_n_uv STRING
  88. ,is_return_noself STRING
  89. ,return_1_uv_noself STRING
  90. ,is_return_n_noself STRING
  91. ,return_n_uv_noself STRING
  92. ,new_exposure_cnt STRING
  93. -- ========== B 链 (4 depth × 3 metric = 12 字段) ==========
  94. ,bn_exp STRING COMMENT 'B链全量: 回流用户session曝光数'
  95. ,bn_pv STRING COMMENT 'B链全量: 回流点击次数'
  96. ,bn_uv STRING COMMENT 'B链全量: 回流去重人数'
  97. ,b1_exp STRING COMMENT 'B链depth=1: 回流用户session曝光数'
  98. ,b1_pv STRING COMMENT 'B链depth=1: 回流点击次数'
  99. ,b1_uv STRING COMMENT 'B链depth=1: 回流去重人数'
  100. ,b2_exp STRING COMMENT 'B链depth=2: 回流用户session曝光数'
  101. ,b2_pv STRING COMMENT 'B链depth=2: 回流点击次数'
  102. ,b2_uv STRING COMMENT 'B链depth=2: 回流去重人数'
  103. ,b3_exp STRING COMMENT 'B链depth=3: 回流用户session曝光数'
  104. ,b3_pv STRING COMMENT 'B链depth=3: 回流点击次数'
  105. ,b3_uv STRING COMMENT 'B链depth=3: 回流去重人数'
  106. -- ========== C 链 (4 depth × 3 hop × 3 metric = 36 字段) ==========
  107. ,cn_1_exp STRING COMMENT 'C链全量hop1: 回流用户session曝光数'
  108. ,cn_1_pv STRING COMMENT 'C链全量hop1: 回流点击次数'
  109. ,cn_1_uv STRING COMMENT 'C链全量hop1: 回流去重人数'
  110. ,c1_1_exp STRING COMMENT 'C链depth=1 hop1: 回流用户session曝光数'
  111. ,c1_1_pv STRING COMMENT 'C链depth=1 hop1: 回流点击次数'
  112. ,c1_1_uv STRING COMMENT 'C链depth=1 hop1: 回流去重人数'
  113. ,c2_1_exp STRING COMMENT 'C链depth=2 hop1: 回流用户session曝光数'
  114. ,c2_1_pv STRING COMMENT 'C链depth=2 hop1: 回流点击次数'
  115. ,c2_1_uv STRING COMMENT 'C链depth=2 hop1: 回流去重人数'
  116. ,c3_1_exp STRING COMMENT 'C链depth=3 hop1: 回流用户session曝光数'
  117. ,c3_1_pv STRING COMMENT 'C链depth=3 hop1: 回流点击次数'
  118. ,c3_1_uv STRING COMMENT 'C链depth=3 hop1: 回流去重人数'
  119. ,cn_2_exp STRING COMMENT 'C链全量hop2: 回流用户session曝光数'
  120. ,cn_2_pv STRING COMMENT 'C链全量hop2: 回流点击次数'
  121. ,cn_2_uv STRING COMMENT 'C链全量hop2: 回流去重人数'
  122. ,c1_2_exp STRING COMMENT 'C链depth=1 hop2: 回流用户session曝光数'
  123. ,c1_2_pv STRING COMMENT 'C链depth=1 hop2: 回流点击次数'
  124. ,c1_2_uv STRING COMMENT 'C链depth=1 hop2: 回流去重人数'
  125. ,c2_2_exp STRING COMMENT 'C链depth=2 hop2: 回流用户session曝光数'
  126. ,c2_2_pv STRING COMMENT 'C链depth=2 hop2: 回流点击次数'
  127. ,c2_2_uv STRING COMMENT 'C链depth=2 hop2: 回流去重人数'
  128. ,c3_2_exp STRING COMMENT 'C链depth=3 hop2: 回流用户session曝光数'
  129. ,c3_2_pv STRING COMMENT 'C链depth=3 hop2: 回流点击次数'
  130. ,c3_2_uv STRING COMMENT 'C链depth=3 hop2: 回流去重人数'
  131. ,cn_3_exp STRING COMMENT 'C链全量hop3: 回流用户session曝光数'
  132. ,cn_3_pv STRING COMMENT 'C链全量hop3: 回流点击次数'
  133. ,cn_3_uv STRING COMMENT 'C链全量hop3: 回流去重人数'
  134. ,c1_3_exp STRING COMMENT 'C链depth=1 hop3: 回流用户session曝光数'
  135. ,c1_3_pv STRING COMMENT 'C链depth=1 hop3: 回流点击次数'
  136. ,c1_3_uv STRING COMMENT 'C链depth=1 hop3: 回流去重人数'
  137. ,c2_3_exp STRING COMMENT 'C链depth=2 hop3: 回流用户session曝光数'
  138. ,c2_3_pv STRING COMMENT 'C链depth=2 hop3: 回流点击次数'
  139. ,c2_3_uv STRING COMMENT 'C链depth=2 hop3: 回流去重人数'
  140. ,c3_3_exp STRING COMMENT 'C链depth=3 hop3: 回流用户session曝光数'
  141. ,c3_3_pv STRING COMMENT 'C链depth=3 hop3: 回流点击次数'
  142. ,c3_3_uv STRING COMMENT 'C链depth=3 hop3: 回流去重人数'
  143. -- ========== D 链 (d0 + 4 depth × 3 hop × 3 metric = 37 字段) ==========
  144. ,d0 STRING COMMENT 'D链初始成本: session内后续曝光数'
  145. ,dn_1_exp STRING COMMENT 'D链全量hop1: 回流用户session曝光数'
  146. ,dn_1_pv STRING COMMENT 'D链全量hop1: 回流点击次数'
  147. ,dn_1_uv STRING COMMENT 'D链全量hop1: 回流去重人数'
  148. ,d1_1_exp STRING COMMENT 'D链depth=1 hop1: 回流用户session曝光数'
  149. ,d1_1_pv STRING COMMENT 'D链depth=1 hop1: 回流点击次数'
  150. ,d1_1_uv STRING COMMENT 'D链depth=1 hop1: 回流去重人数'
  151. ,d2_1_exp STRING COMMENT 'D链depth=2 hop1: 回流用户session曝光数'
  152. ,d2_1_pv STRING COMMENT 'D链depth=2 hop1: 回流点击次数'
  153. ,d2_1_uv STRING COMMENT 'D链depth=2 hop1: 回流去重人数'
  154. ,d3_1_exp STRING COMMENT 'D链depth=3 hop1: 回流用户session曝光数'
  155. ,d3_1_pv STRING COMMENT 'D链depth=3 hop1: 回流点击次数'
  156. ,d3_1_uv STRING COMMENT 'D链depth=3 hop1: 回流去重人数'
  157. ,dn_2_exp STRING COMMENT 'D链全量hop2: 回流用户session曝光数'
  158. ,dn_2_pv STRING COMMENT 'D链全量hop2: 回流点击次数'
  159. ,dn_2_uv STRING COMMENT 'D链全量hop2: 回流去重人数'
  160. ,d1_2_exp STRING COMMENT 'D链depth=1 hop2: 回流用户session曝光数'
  161. ,d1_2_pv STRING COMMENT 'D链depth=1 hop2: 回流点击次数'
  162. ,d1_2_uv STRING COMMENT 'D链depth=1 hop2: 回流去重人数'
  163. ,d2_2_exp STRING COMMENT 'D链depth=2 hop2: 回流用户session曝光数'
  164. ,d2_2_pv STRING COMMENT 'D链depth=2 hop2: 回流点击次数'
  165. ,d2_2_uv STRING COMMENT 'D链depth=2 hop2: 回流去重人数'
  166. ,d3_2_exp STRING COMMENT 'D链depth=3 hop2: 回流用户session曝光数'
  167. ,d3_2_pv STRING COMMENT 'D链depth=3 hop2: 回流点击次数'
  168. ,d3_2_uv STRING COMMENT 'D链depth=3 hop2: 回流去重人数'
  169. ,dn_3_exp STRING COMMENT 'D链全量hop3: 回流用户session曝光数'
  170. ,dn_3_pv STRING COMMENT 'D链全量hop3: 回流点击次数'
  171. ,dn_3_uv STRING COMMENT 'D链全量hop3: 回流去重人数'
  172. ,d1_3_exp STRING COMMENT 'D链depth=1 hop3: 回流用户session曝光数'
  173. ,d1_3_pv STRING COMMENT 'D链depth=1 hop3: 回流点击次数'
  174. ,d1_3_uv STRING COMMENT 'D链depth=1 hop3: 回流去重人数'
  175. ,d2_3_exp STRING COMMENT 'D链depth=2 hop3: 回流用户session曝光数'
  176. ,d2_3_pv STRING COMMENT 'D链depth=2 hop3: 回流点击次数'
  177. ,d2_3_uv STRING COMMENT 'D链depth=2 hop3: 回流去重人数'
  178. ,d3_3_exp STRING COMMENT 'D链depth=3 hop3: 回流用户session曝光数'
  179. ,d3_3_pv STRING COMMENT 'D链depth=3 hop3: 回流点击次数'
  180. ,d3_3_uv STRING COMMENT 'D链depth=3 hop3: 回流去重人数'
  181. ,extend STRING
  182. -- ========== mids 列表字段 (变长, 统一放末尾) ==========
  183. ,return_1_mids STRING
  184. ,return_n_mids STRING
  185. ,return_1_mids_noself STRING
  186. ,return_n_mids_noself STRING
  187. ,bn_mids STRING COMMENT 'B链全量: 回流mid列表'
  188. ,b1_mids STRING COMMENT 'B链depth=1: 回流mid列表'
  189. ,b2_mids STRING COMMENT 'B链depth=2: 回流mid列表'
  190. ,b3_mids STRING COMMENT 'B链depth=3: 回流mid列表'
  191. ,cn_1_mids STRING COMMENT 'C链全量hop1: 回流mid列表'
  192. ,c1_1_mids STRING COMMENT 'C链depth=1 hop1: 回流mid列表'
  193. ,c2_1_mids STRING COMMENT 'C链depth=2 hop1: 回流mid列表'
  194. ,c3_1_mids STRING COMMENT 'C链depth=3 hop1: 回流mid列表'
  195. ,cn_2_mids STRING COMMENT 'C链全量hop2: 回流mid列表'
  196. ,c1_2_mids STRING COMMENT 'C链depth=1 hop2: 回流mid列表'
  197. ,c2_2_mids STRING COMMENT 'C链depth=2 hop2: 回流mid列表'
  198. ,c3_2_mids STRING COMMENT 'C链depth=3 hop2: 回流mid列表'
  199. ,cn_3_mids STRING COMMENT 'C链全量hop3: 回流mid列表'
  200. ,c1_3_mids STRING COMMENT 'C链depth=1 hop3: 回流mid列表'
  201. ,c2_3_mids STRING COMMENT 'C链depth=2 hop3: 回流mid列表'
  202. ,c3_3_mids STRING COMMENT 'C链depth=3 hop3: 回流mid列表'
  203. ,dn_1_mids STRING COMMENT 'D链全量hop1: 回流mid列表'
  204. ,d1_1_mids STRING COMMENT 'D链depth=1 hop1: 回流mid列表'
  205. ,d2_1_mids STRING COMMENT 'D链depth=2 hop1: 回流mid列表'
  206. ,d3_1_mids STRING COMMENT 'D链depth=3 hop1: 回流mid列表'
  207. ,dn_2_mids STRING COMMENT 'D链全量hop2: 回流mid列表'
  208. ,d1_2_mids STRING COMMENT 'D链depth=1 hop2: 回流mid列表'
  209. ,d2_2_mids STRING COMMENT 'D链depth=2 hop2: 回流mid列表'
  210. ,d3_2_mids STRING COMMENT 'D链depth=3 hop2: 回流mid列表'
  211. ,dn_3_mids STRING COMMENT 'D链全量hop3: 回流mid列表'
  212. ,d1_3_mids STRING COMMENT 'D链depth=1 hop3: 回流mid列表'
  213. ,d2_3_mids STRING COMMENT 'D链depth=2 hop3: 回流mid列表'
  214. ,d3_3_mids STRING COMMENT 'D链depth=3 hop3: 回流mid列表'
  215. )
  216. PARTITIONED BY
  217. (
  218. dt STRING COMMENT '日期:20240105'
  219. ,hh STRING COMMENT '小时:04'
  220. )
  221. STORED AS ALIORC
  222. TBLPROPERTIES ('comment' = '推荐算法-labelmatch表-20260209更新-含多跳B/C/D-sharedepth维度')
  223. LIFECYCLE 3650
  224. ;
  225. SET hive.exec.dynamic.partition = true
  226. ;
  227. SET hive.exec.dynamic.partition.mode = nonstrict
  228. ;
  229. SET odps.stage.mapper.split.size = 1024
  230. ;
  231. INSERT OVERWRITE TABLE loghubods.dwd_recsys_alg_exposure_base_20260209 PARTITION (dt,hh)
  232. WITH t_return AS
  233. (
  234. SELECT *
  235. ,CONCAT(dthh,":",shareid,":",vid,":",dthh_id) AS id
  236. FROM (
  237. SELECT CONCAT(year,month,day,hour) AS dthh
  238. ,apptype
  239. ,machinecode AS mid
  240. ,clickobjectid AS vid
  241. ,sessionid
  242. ,subsessionid -- 注意这是回流对应的subsessionid,每次回流点击会重置,可以通过这个字段找到回流的曝光。
  243. ,shareid
  244. ,rootshareid
  245. ,CAST(clienttimestamp / 1000 AS BIGINT) AS ts
  246. ,CAST(sharedepth AS BIGINT) AS sharedepth
  247. ,ROW_NUMBER() OVER (PARTITION BY CONCAT(year,month,day,hour),apptype,machinecode,clickobjectid,sessionid,subsessionid,shareid,rootshareid ORDER BY clienttimestamp DESC ) AS rn
  248. ,ROW_NUMBER() OVER (PARTITION BY CONCAT(year,month,day,hour),shareid,clickobjectid ORDER BY clienttimestamp ) AS dthh_id
  249. FROM loghubods.user_share_log_flow -- 回流行为,理应subsessionid只有一条,但有脏数据,去重。
  250. WHERE CONCAT(year,month,day,hour) BETWEEN TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 25),'YYYYMMDDHH') AND TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 1),'YYYYMMDDHH') --WHERE CONCAT(year,month,day,hour) = TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 25),'YYYYMMDDHH')
  251. AND __topic__ = 'click'
  252. AND apptype IS NOT NULL
  253. AND apptype NOT IN ('12') -- 12的pagesoucre是h5-share和h5-detail 暂时过滤掉 不做处理
  254. AND machinecode IS NOT NULL
  255. AND clickobjectid IS NOT NULL
  256. AND pagesource REGEXP "-pages/user-videos-share$" -- 存在脏数据 vlog-gzh /mine/mine-info$ 结尾的,都过滤掉。
  257. )
  258. WHERE rn = 1
  259. )
  260. ,t_share_from_sharelog AS
  261. (
  262. SELECT *
  263. FROM (
  264. SELECT CONCAT(year,month,day,hour) AS dthh
  265. ,apptype
  266. ,machinecode AS mid
  267. ,shareobjectid AS vid
  268. ,sessionid
  269. ,subsessionid
  270. ,pagesource
  271. ,shareid
  272. ,CAST(clienttimestamp / 1000 AS BIGINT) AS ts
  273. ,ROW_NUMBER() OVER (PARTITION BY CONCAT(year,month,day,hour),apptype,machinecode,shareobjectid,sessionid,subsessionid,pagesource,shareid ORDER BY clienttimestamp DESC ) AS rn
  274. FROM loghubods.user_share_log_flow
  275. WHERE CONCAT(year,month,day,hour) BETWEEN TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 25),'YYYYMMDDHH') AND TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 1),'YYYYMMDDHH') --WHERE CONCAT(year,month,day,hour) = TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 25),'YYYYMMDDHH')
  276. AND __topic__ = 'share'
  277. AND apptype IS NOT NULL
  278. AND apptype NOT IN ('12')
  279. AND machinecode IS NOT NULL
  280. AND shareobjectid IS NOT NULL
  281. )
  282. WHERE rn = 1
  283. )
  284. ,t_exposure_raw AS
  285. (
  286. SELECT ROW_NUMBER() OVER (PARTITION BY CONCAT(year,month,day,hour),subsessionid ORDER BY clienttimestamp DESC ) AS dthh_id
  287. ,CONCAT(year,month,day,hour) AS dthh
  288. ,apptype
  289. ,uid
  290. ,mid
  291. ,videoid AS vid
  292. ,sessionid
  293. ,subsessionid
  294. ,rootsessionid_new
  295. ,pagesource
  296. ,recommendlogvo
  297. ,COALESCE(GET_JSON_OBJECT(extparams,'$.eventInfos.ab_test003'),"unknown") AS abcode
  298. ,GET_JSON_OBJECT(extparams,'$.recommendPageType') AS recommendpagetype
  299. ,GET_JSON_OBJECT(extparams,'$.recomTraceId') AS recomtraceid
  300. ,CASE WHEN GET_JSON_OBJECT(extParams,'$.head_videoid') IS NOT NULL THEN GET_JSON_OBJECT(extParams,'$.head_videoid')
  301. ELSE GET_JSON_OBJECT(extParams,'$.head_videoId')
  302. END AS headvideoid
  303. ,GET_JSON_OBJECT(extParams,'$.rootSourceId') AS rootsourceid
  304. ,COALESCE(hotsencetype,sencetype,"other") AS hotsencetype
  305. ,GET_JSON_OBJECT(extParams,'$.animationSceneType') AS animationscenetype
  306. ,JSON_PARSE(IF(JSON_VALID(extparams),extparams,"{}")) AS extParams
  307. ,flowpool
  308. ,SPLIT(flowpool,'#')[2] AS level
  309. ,clientip
  310. ,machineinfo_brand
  311. ,machineinfo_model
  312. ,machineinfo_system
  313. ,machineinfo_wechatversion
  314. ,machineinfo_sdkversion
  315. ,ANALYSISIP(clientip,"region") AS province
  316. ,ANALYSISIP(clientip,"city") AS city
  317. ,versioncode
  318. ,CAST(logtimestamp / 1000 AS BIGINT) AS ts
  319. ,ROW_NUMBER() OVER (PARTITION BY CONCAT(year,month,day,hour),apptype,uid,mid,videoid,sessionid,subsessionid,pagesource ORDER BY logtimestamp ) AS rn
  320. FROM loghubods.video_action_log_flow_new
  321. WHERE CONCAT(year,month,day,hour) BETWEEN TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 25),'YYYYMMDDHH') AND TO_CHAR(FROM_UNIXTIME(UNIX_TIMESTAMP(TO_DATE('${dt}${hh}','YYYYMMDDHH')) - 3600 * 1),'YYYYMMDDHH')
  322. AND businesstype IN ('videoView')
  323. AND apptype IS NOT NULL
  324. AND apptype NOT IN ('12')
  325. AND mid IS NOT NULL
  326. AND videoid IS NOT NULL
  327. )
  328. ,t_exposure AS
  329. (
  330. SELECT dthh_id ,dthh ,apptype ,uid ,mid ,vid ,sessionid ,subsessionid ,rootsessionid_new ,pagesource
  331. ,recommendlogvo ,abcode ,recommendpagetype ,recomtraceid ,headvideoid ,rootsourceid ,hotsencetype
  332. ,animationscenetype ,extParams ,flowpool ,level ,clientip ,machineinfo_brand ,machineinfo_model
  333. ,machineinfo_system ,machineinfo_wechatversion ,machineinfo_sdkversion ,province ,city ,versioncode
  334. ,ts ,rn ,CONCAT(dthh,":",subsessionid,":",dthh_id) AS id
  335. FROM t_exposure_raw
  336. WHERE pagesource NOT REGEXP "-pages/user-videos-share$"
  337. AND rn = 1
  338. UNION ALL
  339. SELECT dthh_id ,dthh ,apptype ,uid ,mid ,vid ,sessionid ,subsessionid ,rootsessionid_new ,pagesource
  340. ,recommendlogvo ,abcode ,recommendpagetype ,recomtraceid ,headvideoid ,rootsourceid ,hotsencetype
  341. ,animationscenetype ,extParams ,flowpool ,level ,clientip ,machineinfo_brand ,machineinfo_model
  342. ,machineinfo_system ,machineinfo_wechatversion ,machineinfo_sdkversion ,province ,city ,versioncode
  343. ,ts ,rn ,CONCAT(dthh,":",subsessionid,":",dthh_id) AS id
  344. FROM t_exposure_raw
  345. WHERE pagesource REGEXP "-pages/user-videos-share$"
  346. )
  347. ,t_exposure_recommend AS
  348. (
  349. SELECT *
  350. FROM t_exposure
  351. WHERE pagesource REGEXP 'category$|recommend$|-pages/user-videos-detail$'
  352. )
  353. ,t_return_exposure_1 AS -- 曝光关联回流,用于计算viewh24
  354. (
  355. SELECT *
  356. FROM (
  357. SELECT t1.id AS exposure_id
  358. ,t1.mid AS mid
  359. ,t1.vid AS vid
  360. ,t1.subsessionid AS subsessionid
  361. ,t1.sessionid AS sessionid
  362. ,t1.headvideoid AS headvideoid
  363. ,t1.dthh
  364. ,t2.id AS return_id
  365. ,ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.ts DESC ) AS rn
  366. FROM t_exposure_recommend t1
  367. LEFT JOIN t_return t2
  368. ON t1.mid = t2.mid
  369. AND t1.headvideoid = t2.vid
  370. AND t1.subsessionid = t2.subsessionid
  371. )
  372. WHERE rn = 1
  373. )
  374. ,t_return_exposure_2 AS -- 曝光关联回流,用于计算viewh24
  375. (
  376. SELECT *
  377. FROM (
  378. SELECT t1.exposure_id AS exposure_id
  379. ,t1.mid AS mid
  380. ,t1.vid AS vid
  381. ,t1.subsessionid AS subsessionid
  382. ,t1.sessionid AS sessionid
  383. ,t1.headvideoid AS headvideoid
  384. ,t1.dthh
  385. ,t2.id AS return_id
  386. ,ROW_NUMBER() OVER (PARTITION BY t1.exposure_id ORDER BY t2.ts DESC ) AS rn
  387. FROM (
  388. SELECT *
  389. FROM t_return_exposure_1
  390. WHERE return_id IS NULL
  391. ) t1
  392. LEFT JOIN t_return t2
  393. ON t1.mid = t2.mid
  394. AND t1.headvideoid = t2.vid
  395. AND t1.sessionid = t2.sessionid
  396. )
  397. WHERE rn = 1
  398. )
  399. ,t_return_exposure_3 AS -- 曝光关联回流,用于计算viewh24
  400. (
  401. SELECT *
  402. FROM (
  403. SELECT t1.exposure_id AS exposure_id
  404. ,t1.mid AS mid
  405. ,t1.vid AS vid
  406. ,t1.subsessionid AS subsessionid
  407. ,t1.sessionid AS sessionid
  408. ,t1.headvideoid AS headvideoid
  409. ,t1.dthh
  410. ,t2.id AS return_id
  411. ,ROW_NUMBER() OVER (PARTITION BY t1.exposure_id ORDER BY t2.ts DESC ) AS rn
  412. FROM (
  413. SELECT *
  414. FROM t_return_exposure_2
  415. WHERE return_id IS NULL
  416. ) t1
  417. LEFT JOIN t_return t2
  418. ON t1.mid = t2.mid
  419. AND t1.subsessionid = t2.subsessionid
  420. )
  421. WHERE rn = 1
  422. )
  423. ,t_return_exposure_4 AS -- 曝光关联回流,用于计算viewh24
  424. (
  425. SELECT *
  426. FROM (
  427. SELECT t1.exposure_id AS exposure_id
  428. ,t1.mid AS mid
  429. ,t1.vid AS vid
  430. ,t1.subsessionid AS subsessionid
  431. ,t1.sessionid AS sessionid
  432. ,t1.headvideoid AS headvideoid
  433. ,t1.dthh
  434. ,t2.id AS return_id
  435. ,ROW_NUMBER() OVER (PARTITION BY t1.exposure_id ORDER BY t2.ts DESC ) AS rn
  436. FROM (
  437. SELECT *
  438. FROM t_return_exposure_3
  439. WHERE return_id IS NULL
  440. ) t1
  441. LEFT JOIN t_return t2
  442. ON t1.mid = t2.mid
  443. AND t1.sessionid = t2.sessionid
  444. )
  445. WHERE rn = 1
  446. )
  447. ,t_return_exposure AS
  448. (
  449. SELECT a.*
  450. ,b.exposure_cnt AS new_exposure_cnt
  451. FROM t_return a
  452. LEFT JOIN (
  453. SELECT return_id
  454. ,COUNT(1) AS exposure_cnt
  455. FROM (
  456. SELECT *
  457. FROM t_return_exposure_1
  458. WHERE return_id IS NOT NULL
  459. UNION ALL
  460. SELECT *
  461. FROM t_return_exposure_2
  462. WHERE return_id IS NOT NULL
  463. UNION ALL
  464. SELECT *
  465. FROM t_return_exposure_3
  466. WHERE return_id IS NOT NULL
  467. UNION ALL
  468. SELECT *
  469. FROM t_return_exposure_4
  470. WHERE return_id IS NOT NULL
  471. )
  472. GROUP BY return_id
  473. ) b
  474. ON a.id = b.return_id
  475. )
  476. ,t_normal_share_exposure_1 AS -- 开始处理常规的分享与曝光关联
  477. (
  478. SELECT *
  479. FROM (
  480. SELECT t1.dthh
  481. ,t1.apptype
  482. ,t1.mid
  483. ,t1.vid
  484. ,t1.sessionid
  485. ,t1.subsessionid
  486. ,t1.pagesource
  487. ,t1.shareid
  488. ,t1.ts
  489. ,t2.id AS exposure_id
  490. ,t2.ts AS exposure_ts
  491. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  492. FROM t_share_from_sharelog t1
  493. LEFT JOIN t_exposure t2
  494. ON t1.apptype = t2.apptype
  495. AND t1.mid = t2.mid
  496. AND t1.vid = t2.vid
  497. AND t1.subsessionid = t2.subsessionid
  498. AND t1.pagesource = t2.pagesource
  499. AND t1.ts >= t2.ts
  500. WHERE t1.pagesource NOT REGEXP "pages/detail-user-videos-share-recommend$"
  501. )
  502. WHERE rn = 1
  503. )
  504. ,t_normal_share_exposure_2 AS
  505. (
  506. SELECT *
  507. FROM (
  508. SELECT t1.dthh
  509. ,t1.apptype
  510. ,t1.mid
  511. ,t1.vid
  512. ,t1.sessionid
  513. ,t1.subsessionid
  514. ,t1.pagesource
  515. ,t1.shareid
  516. ,t1.ts
  517. ,t2.id AS exposure_id
  518. ,t2.ts AS exposure_ts
  519. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  520. FROM (
  521. SELECT *
  522. FROM t_normal_share_exposure_1
  523. WHERE exposure_id IS NULL
  524. ) t1
  525. LEFT JOIN t_exposure t2
  526. ON t1.apptype = t2.apptype
  527. AND t1.mid = t2.mid
  528. AND t1.vid = t2.vid
  529. AND t1.sessionid = t2.sessionid
  530. AND t1.pagesource = t2.pagesource
  531. AND t1.ts >= t2.ts
  532. )
  533. WHERE rn = 1
  534. )
  535. ,t_normal_share_exposure_3 AS
  536. (
  537. SELECT *
  538. FROM (
  539. SELECT t1.dthh
  540. ,t1.apptype
  541. ,t1.mid
  542. ,t1.vid
  543. ,t1.sessionid
  544. ,t1.subsessionid
  545. ,t1.pagesource
  546. ,t1.shareid
  547. ,t1.ts
  548. ,t2.id AS exposure_id
  549. ,t2.ts AS exposure_ts
  550. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  551. FROM (
  552. SELECT *
  553. FROM t_normal_share_exposure_2
  554. WHERE exposure_id IS NULL
  555. ) t1
  556. LEFT JOIN t_exposure t2
  557. ON t1.apptype = t2.apptype
  558. AND t1.mid = t2.mid
  559. AND t1.vid = t2.vid
  560. AND t1.subsessionid = t2.subsessionid
  561. AND t1.pagesource = t2.pagesource
  562. AND t1.ts >= t2.ts
  563. )
  564. WHERE rn = 1
  565. )
  566. ,t_normal_share_exposure_4 AS
  567. (
  568. SELECT *
  569. FROM (
  570. SELECT t1.dthh
  571. ,t1.apptype
  572. ,t1.mid
  573. ,t1.vid
  574. ,t1.sessionid
  575. ,t1.subsessionid
  576. ,t1.pagesource
  577. ,t1.shareid
  578. ,t1.ts
  579. ,t2.id AS exposure_id
  580. ,t2.ts AS exposure_ts
  581. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  582. FROM (
  583. SELECT *
  584. FROM t_normal_share_exposure_3
  585. WHERE exposure_id IS NULL
  586. ) t1
  587. LEFT JOIN t_exposure t2
  588. ON t1.apptype = t2.apptype
  589. AND t1.mid = t2.mid
  590. AND t1.vid = t2.vid
  591. AND t1.sessionid = t2.sessionid
  592. AND t1.pagesource = t2.pagesource
  593. AND t1.ts >= t2.ts
  594. )
  595. WHERE rn = 1
  596. )
  597. ,t_normal_share_exposure_5 AS
  598. (
  599. SELECT *
  600. FROM (
  601. SELECT t1.dthh
  602. ,t1.apptype
  603. ,t1.mid
  604. ,t1.vid
  605. ,t1.sessionid
  606. ,t1.subsessionid
  607. ,t1.pagesource
  608. ,t1.shareid
  609. ,t1.ts
  610. ,t2.id AS exposure_id
  611. ,t2.ts AS exposure_ts
  612. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  613. FROM (
  614. SELECT *
  615. FROM t_normal_share_exposure_4
  616. WHERE exposure_id IS NULL
  617. ) t1
  618. LEFT JOIN t_exposure t2
  619. ON t1.apptype = t2.apptype
  620. AND t1.mid = t2.mid
  621. AND t1.vid = t2.vid
  622. AND t1.subsessionid = t2.subsessionid
  623. )
  624. WHERE rn = 1
  625. )
  626. ,t_normal_share_exposure_6 AS
  627. (
  628. SELECT *
  629. FROM (
  630. SELECT t1.dthh
  631. ,t1.apptype
  632. ,t1.mid
  633. ,t1.vid
  634. ,t1.sessionid
  635. ,t1.subsessionid
  636. ,t1.pagesource
  637. ,t1.shareid
  638. ,t1.ts
  639. ,t2.id AS exposure_id
  640. ,t2.ts AS exposure_ts
  641. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  642. FROM (
  643. SELECT *
  644. FROM t_normal_share_exposure_5
  645. WHERE exposure_id IS NULL
  646. ) t1
  647. LEFT JOIN t_exposure t2
  648. ON t1.apptype = t2.apptype
  649. AND t1.mid = t2.mid
  650. AND t1.vid = t2.vid
  651. AND t1.sessionid = t2.sessionid
  652. )
  653. WHERE rn = 1
  654. )
  655. ,t_exposure_detail AS
  656. (
  657. SELECT *
  658. FROM t_exposure
  659. WHERE pagesource REGEXP "-pages/user-videos-detail$|pages/detail-recommend$"
  660. )
  661. ,t_no_normal_share_exposure_1 AS -- 开始处理非常规的分享与曝光关联
  662. (
  663. SELECT *
  664. FROM (
  665. SELECT t1.dthh
  666. ,t1.apptype
  667. ,t1.mid
  668. ,t1.vid
  669. ,t1.sessionid
  670. ,t1.subsessionid
  671. ,t1.pagesource
  672. ,t1.shareid
  673. ,t1.ts
  674. ,t2.id AS exposure_id
  675. ,t2.ts AS exposure_ts
  676. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  677. FROM t_share_from_sharelog t1
  678. LEFT JOIN t_exposure_detail t2
  679. ON t1.apptype = t2.apptype
  680. AND t1.mid = t2.mid
  681. AND t1.vid = t2.vid
  682. AND t1.subsessionid = t2.subsessionid
  683. AND t1.ts >= t2.ts
  684. WHERE t1.pagesource REGEXP "pages/detail-user-videos-share-recommend$"
  685. )
  686. WHERE rn = 1
  687. )
  688. ,t_no_normal_share_exposure_2 AS
  689. (
  690. SELECT *
  691. FROM (
  692. SELECT t1.dthh
  693. ,t1.apptype
  694. ,t1.mid
  695. ,t1.vid
  696. ,t1.sessionid
  697. ,t1.subsessionid
  698. ,t1.pagesource
  699. ,t1.shareid
  700. ,t1.ts
  701. ,t2.id AS exposure_id
  702. ,t2.ts AS exposure_ts
  703. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  704. FROM (
  705. SELECT *
  706. FROM t_no_normal_share_exposure_1
  707. WHERE exposure_id IS NULL
  708. ) t1
  709. LEFT JOIN t_exposure_detail t2
  710. ON t1.apptype = t2.apptype
  711. AND t1.mid = t2.mid
  712. AND t1.vid = t2.vid
  713. AND t1.sessionid = t2.sessionid
  714. AND t1.ts >= t2.ts
  715. )
  716. WHERE rn = 1
  717. )
  718. ,t_no_normal_share_exposure_3 AS
  719. (
  720. SELECT *
  721. FROM (
  722. SELECT t1.dthh
  723. ,t1.apptype
  724. ,t1.mid
  725. ,t1.vid
  726. ,t1.sessionid
  727. ,t1.subsessionid
  728. ,t1.pagesource
  729. ,t1.shareid
  730. ,t1.ts
  731. ,t2.id AS exposure_id
  732. ,t2.ts AS exposure_ts
  733. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  734. FROM (
  735. SELECT *
  736. FROM t_no_normal_share_exposure_2
  737. WHERE exposure_id IS NULL
  738. ) t1
  739. LEFT JOIN t_exposure_detail t2
  740. ON t1.apptype = t2.apptype
  741. AND t1.mid = t2.mid
  742. AND t1.vid = t2.vid
  743. AND t1.subsessionid = t2.subsessionid
  744. )
  745. WHERE rn = 1
  746. )
  747. ,t_no_normal_share_exposure_4 AS
  748. (
  749. SELECT *
  750. FROM (
  751. SELECT t1.dthh
  752. ,t1.apptype
  753. ,t1.mid
  754. ,t1.vid
  755. ,t1.sessionid
  756. ,t1.subsessionid
  757. ,t1.pagesource
  758. ,t1.shareid
  759. ,t1.ts
  760. ,t2.id AS exposure_id
  761. ,t2.ts AS exposure_ts
  762. ,ROW_NUMBER() OVER (PARTITION BY t1.dthh,t1.apptype,t1.mid,t1.vid,t1.sessionid,t1.subsessionid,t1.pagesource,t1.shareid ORDER BY t2.ts DESC ) AS rn
  763. FROM (
  764. SELECT *
  765. FROM t_no_normal_share_exposure_3
  766. WHERE exposure_id IS NULL
  767. ) t1
  768. LEFT JOIN t_exposure_detail t2
  769. ON t1.apptype = t2.apptype
  770. AND t1.mid = t2.mid
  771. AND t1.vid = t2.vid
  772. AND t1.sessionid = t2.sessionid
  773. )
  774. WHERE rn = 1
  775. )
  776. ,t_share_exposure AS
  777. (
  778. SELECT *
  779. FROM t_normal_share_exposure_1
  780. WHERE exposure_id IS NOT NULL
  781. UNION ALL
  782. SELECT *
  783. FROM t_normal_share_exposure_2
  784. WHERE exposure_id IS NOT NULL
  785. UNION ALL
  786. SELECT *
  787. FROM t_normal_share_exposure_3
  788. WHERE exposure_id IS NOT NULL
  789. UNION ALL
  790. SELECT *
  791. FROM t_normal_share_exposure_4
  792. WHERE exposure_id IS NOT NULL
  793. UNION ALL
  794. SELECT *
  795. FROM t_normal_share_exposure_5
  796. WHERE exposure_id IS NOT NULL
  797. UNION ALL
  798. SELECT *
  799. FROM t_normal_share_exposure_6
  800. UNION ALL
  801. SELECT *
  802. FROM t_no_normal_share_exposure_1
  803. WHERE exposure_id IS NOT NULL
  804. UNION ALL
  805. SELECT *
  806. FROM t_no_normal_share_exposure_2
  807. WHERE exposure_id IS NOT NULL
  808. UNION ALL
  809. SELECT *
  810. FROM t_no_normal_share_exposure_3
  811. WHERE exposure_id IS NOT NULL
  812. UNION ALL
  813. SELECT *
  814. FROM t_no_normal_share_exposure_4
  815. )
  816. --========================================
  817. -- 多跳 B/C/D 计算 (BFS frontier + anti-join 去环, 仅 24h)
  818. --========================================
  819. ,t_share_return AS (
  820. SELECT se.exposure_id
  821. ,se.shareid
  822. ,se.vid
  823. ,se.apptype
  824. ,se.subsessionid
  825. ,r.subsessionid AS return_subsessionid
  826. ,r.mid AS return_mid
  827. ,r.sharedepth
  828. FROM t_share_exposure se
  829. JOIN t_return r
  830. ON se.shareid = r.rootshareid
  831. AND se.vid = r.vid
  832. AND se.apptype = r.apptype
  833. )
  834. --========================================
  835. -- B 链: pv/uv/mids (按 sharedepth 拆分)
  836. --========================================
  837. ,t_exposure_bn AS (
  838. SELECT exposure_id
  839. ,COUNT(return_mid) AS bn_pv
  840. ,COLLECT_SET(return_mid) AS bn_mids
  841. ,COUNT(CASE WHEN sharedepth = 1 THEN return_mid END) AS b1_pv
  842. ,COLLECT_SET(CASE WHEN sharedepth = 1 THEN return_mid END) AS b1_mids
  843. ,COUNT(CASE WHEN sharedepth = 2 THEN return_mid END) AS b2_pv
  844. ,COLLECT_SET(CASE WHEN sharedepth = 2 THEN return_mid END) AS b2_mids
  845. ,COUNT(CASE WHEN sharedepth = 3 THEN return_mid END) AS b3_pv
  846. ,COLLECT_SET(CASE WHEN sharedepth = 3 THEN return_mid END) AS b3_mids
  847. FROM t_share_return
  848. GROUP BY exposure_id
  849. )
  850. --========================================
  851. -- B 链: exp (回流用户 session 内曝光数, 按 sharedepth 拆分)
  852. --========================================
  853. ,t_b_exp AS (
  854. SELECT sr.exposure_id
  855. ,COUNT(e.id) AS bn_exp
  856. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e.id END) AS b1_exp
  857. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e.id END) AS b2_exp
  858. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e.id END) AS b3_exp
  859. FROM (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth
  860. FROM t_share_return) sr
  861. JOIN t_exposure e ON sr.return_subsessionid = e.subsessionid
  862. GROUP BY sr.exposure_id
  863. )
  864. -- BFS frontier 1: 直达回流的 subsessionid 集合
  865. ,t_frontier_1 AS (
  866. SELECT DISTINCT exposure_id AS source_id, return_subsessionid AS reached_sub
  867. FROM t_share_return
  868. )
  869. --========================================
  870. -- C 链 hop1: pv/uv/mids (按 sharedepth 拆分)
  871. --========================================
  872. ,t_c_hop1 AS (
  873. SELECT f.source_id AS exposure_id
  874. ,COUNT(sr.return_mid) AS cn_1_pv
  875. ,COLLECT_SET(sr.return_mid) AS cn_1_mids
  876. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_1_pv
  877. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_1_mids
  878. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_1_pv
  879. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_1_mids
  880. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_1_pv
  881. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_1_mids
  882. FROM t_frontier_1 f
  883. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  884. JOIN t_share_return sr ON e.id = sr.exposure_id
  885. GROUP BY f.source_id
  886. )
  887. --========================================
  888. -- C 链 hop1: exp (回流用户 session 内曝光数)
  889. --========================================
  890. ,t_c_hop1_exp AS (
  891. SELECT f.source_id AS exposure_id
  892. ,COUNT(e_ret.id) AS cn_1_exp
  893. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS c1_1_exp
  894. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS c2_1_exp
  895. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS c3_1_exp
  896. FROM t_frontier_1 f
  897. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  898. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  899. ON e.id = sr.exposure_id
  900. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  901. GROUP BY f.source_id
  902. )
  903. -- BFS frontier 2: frontier_1 延伸, anti-join 排除 frontier_1
  904. ,t_frontier_2 AS (
  905. SELECT DISTINCT f1.source_id, sr2.return_subsessionid AS reached_sub
  906. FROM t_frontier_1 f1
  907. JOIN t_exposure e1 ON f1.reached_sub = e1.subsessionid
  908. JOIN t_share_return sr2 ON e1.id = sr2.exposure_id
  909. LEFT JOIN t_frontier_1 v1
  910. ON f1.source_id = v1.source_id
  911. AND sr2.return_subsessionid = v1.reached_sub
  912. WHERE v1.source_id IS NULL
  913. )
  914. --========================================
  915. -- C 链 hop2: pv/uv/mids (按 sharedepth 拆分)
  916. --========================================
  917. ,t_c_hop2 AS (
  918. SELECT f.source_id AS exposure_id
  919. ,COUNT(sr.return_mid) AS cn_2_pv
  920. ,COLLECT_SET(sr.return_mid) AS cn_2_mids
  921. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_2_pv
  922. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_2_mids
  923. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_2_pv
  924. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_2_mids
  925. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_2_pv
  926. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_2_mids
  927. FROM t_frontier_2 f
  928. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  929. JOIN t_share_return sr ON e.id = sr.exposure_id
  930. GROUP BY f.source_id
  931. )
  932. --========================================
  933. -- C 链 hop2: exp
  934. --========================================
  935. ,t_c_hop2_exp AS (
  936. SELECT f.source_id AS exposure_id
  937. ,COUNT(e_ret.id) AS cn_2_exp
  938. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS c1_2_exp
  939. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS c2_2_exp
  940. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS c3_2_exp
  941. FROM t_frontier_2 f
  942. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  943. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  944. ON e.id = sr.exposure_id
  945. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  946. GROUP BY f.source_id
  947. )
  948. -- BFS frontier 3: frontier_2 延伸, anti-join 排除 frontier_1 + frontier_2
  949. ,t_frontier_3 AS (
  950. SELECT DISTINCT f2.source_id, sr3.return_subsessionid AS reached_sub
  951. FROM t_frontier_2 f2
  952. JOIN t_exposure e2 ON f2.reached_sub = e2.subsessionid
  953. JOIN t_share_return sr3 ON e2.id = sr3.exposure_id
  954. LEFT JOIN t_frontier_1 v1
  955. ON f2.source_id = v1.source_id
  956. AND sr3.return_subsessionid = v1.reached_sub
  957. LEFT JOIN t_frontier_2 v2
  958. ON f2.source_id = v2.source_id
  959. AND sr3.return_subsessionid = v2.reached_sub
  960. WHERE v1.source_id IS NULL AND v2.source_id IS NULL
  961. )
  962. --========================================
  963. -- C 链 hop3: pv/uv/mids (按 sharedepth 拆分)
  964. --========================================
  965. ,t_c_hop3 AS (
  966. SELECT f.source_id AS exposure_id
  967. ,COUNT(sr.return_mid) AS cn_3_pv
  968. ,COLLECT_SET(sr.return_mid) AS cn_3_mids
  969. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_3_pv
  970. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS c1_3_mids
  971. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_3_pv
  972. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS c2_3_mids
  973. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_3_pv
  974. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS c3_3_mids
  975. FROM t_frontier_3 f
  976. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  977. JOIN t_share_return sr ON e.id = sr.exposure_id
  978. GROUP BY f.source_id
  979. )
  980. --========================================
  981. -- C 链 hop3: exp
  982. --========================================
  983. ,t_c_hop3_exp AS (
  984. SELECT f.source_id AS exposure_id
  985. ,COUNT(e_ret.id) AS cn_3_exp
  986. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS c1_3_exp
  987. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS c2_3_exp
  988. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS c3_3_exp
  989. FROM t_frontier_3 f
  990. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  991. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  992. ON e.id = sr.exposure_id
  993. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  994. GROUP BY f.source_id
  995. )
  996. --========================================
  997. -- D 链: session 内后续曝光传播 (BFS 去环)
  998. --========================================
  999. -- D0: session 内后续曝光数 (D 链初始成本)
  1000. ,t_d0 AS (
  1001. SELECT e1.id AS exposure_id
  1002. ,COUNT(e2.id) AS d0
  1003. FROM t_exposure e1
  1004. JOIN t_exposure e2
  1005. ON e1.subsessionid = e2.subsessionid
  1006. AND CAST(e2.ts AS BIGINT) > CAST(e1.ts AS BIGINT)
  1007. GROUP BY e1.id
  1008. )
  1009. -- D 链 hop1: pv/uv/mids (session 内时序 JOIN)
  1010. ,t_d_hop1 AS (
  1011. SELECT e1.id AS exposure_id
  1012. ,COUNT(sr.return_mid) AS dn_1_pv
  1013. ,COLLECT_SET(sr.return_mid) AS dn_1_mids
  1014. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_1_pv
  1015. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_1_mids
  1016. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_1_pv
  1017. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_1_mids
  1018. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_1_pv
  1019. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_1_mids
  1020. FROM t_exposure e1
  1021. JOIN t_exposure e2
  1022. ON e1.subsessionid = e2.subsessionid
  1023. AND CAST(e2.ts AS BIGINT) > CAST(e1.ts AS BIGINT)
  1024. JOIN t_share_return sr ON e2.id = sr.exposure_id
  1025. GROUP BY e1.id
  1026. )
  1027. -- D 链 hop1: exp
  1028. ,t_d_hop1_exp AS (
  1029. SELECT e1.id AS exposure_id
  1030. ,COUNT(e_ret.id) AS dn_1_exp
  1031. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS d1_1_exp
  1032. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS d2_1_exp
  1033. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS d3_1_exp
  1034. FROM t_exposure e1
  1035. JOIN t_exposure e2
  1036. ON e1.subsessionid = e2.subsessionid
  1037. AND CAST(e2.ts AS BIGINT) > CAST(e1.ts AS BIGINT)
  1038. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  1039. ON e2.id = sr.exposure_id
  1040. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  1041. GROUP BY e1.id
  1042. )
  1043. -- D 链 frontier: hop1 延伸
  1044. ,t_d1_frontier AS (
  1045. SELECT DISTINCT e1.id AS source_id
  1046. ,sr.return_subsessionid AS reached_sub
  1047. FROM t_exposure e1
  1048. JOIN t_exposure e2
  1049. ON e1.subsessionid = e2.subsessionid
  1050. AND CAST(e2.ts AS BIGINT) > CAST(e1.ts AS BIGINT)
  1051. JOIN t_share_return sr
  1052. ON e2.id = sr.exposure_id
  1053. )
  1054. -- D 链 hop2: pv/uv/mids
  1055. ,t_d_hop2 AS (
  1056. SELECT f.source_id AS exposure_id
  1057. ,COUNT(sr.return_mid) AS dn_2_pv
  1058. ,COLLECT_SET(sr.return_mid) AS dn_2_mids
  1059. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_2_pv
  1060. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_2_mids
  1061. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_2_pv
  1062. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_2_mids
  1063. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_2_pv
  1064. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_2_mids
  1065. FROM t_d1_frontier f
  1066. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  1067. JOIN t_share_return sr ON e.id = sr.exposure_id
  1068. GROUP BY f.source_id
  1069. )
  1070. -- D 链 hop2: exp
  1071. ,t_d_hop2_exp AS (
  1072. SELECT f.source_id AS exposure_id
  1073. ,COUNT(e_ret.id) AS dn_2_exp
  1074. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS d1_2_exp
  1075. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS d2_2_exp
  1076. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS d3_2_exp
  1077. FROM t_d1_frontier f
  1078. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  1079. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  1080. ON e.id = sr.exposure_id
  1081. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  1082. GROUP BY f.source_id
  1083. )
  1084. -- D 链 frontier 2: hop2 延伸, anti-join 排除 d1_frontier
  1085. ,t_d2_frontier AS (
  1086. SELECT DISTINCT f1.source_id, sr2.return_subsessionid AS reached_sub
  1087. FROM t_d1_frontier f1
  1088. JOIN t_exposure e1 ON f1.reached_sub = e1.subsessionid
  1089. JOIN t_share_return sr2 ON e1.id = sr2.exposure_id
  1090. LEFT JOIN t_d1_frontier v1
  1091. ON f1.source_id = v1.source_id
  1092. AND sr2.return_subsessionid = v1.reached_sub
  1093. WHERE v1.source_id IS NULL
  1094. )
  1095. -- D 链 hop3: pv/uv/mids
  1096. ,t_d_hop3 AS (
  1097. SELECT f.source_id AS exposure_id
  1098. ,COUNT(sr.return_mid) AS dn_3_pv
  1099. ,COLLECT_SET(sr.return_mid) AS dn_3_mids
  1100. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_3_pv
  1101. ,COLLECT_SET(CASE WHEN sr.sharedepth = 1 THEN sr.return_mid END) AS d1_3_mids
  1102. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_3_pv
  1103. ,COLLECT_SET(CASE WHEN sr.sharedepth = 2 THEN sr.return_mid END) AS d2_3_mids
  1104. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_3_pv
  1105. ,COLLECT_SET(CASE WHEN sr.sharedepth = 3 THEN sr.return_mid END) AS d3_3_mids
  1106. FROM t_d2_frontier f
  1107. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  1108. JOIN t_share_return sr ON e.id = sr.exposure_id
  1109. GROUP BY f.source_id
  1110. )
  1111. -- D 链 hop3: exp
  1112. ,t_d_hop3_exp AS (
  1113. SELECT f.source_id AS exposure_id
  1114. ,COUNT(e_ret.id) AS dn_3_exp
  1115. ,COUNT(CASE WHEN sr.sharedepth = 1 THEN e_ret.id END) AS d1_3_exp
  1116. ,COUNT(CASE WHEN sr.sharedepth = 2 THEN e_ret.id END) AS d2_3_exp
  1117. ,COUNT(CASE WHEN sr.sharedepth = 3 THEN e_ret.id END) AS d3_3_exp
  1118. FROM t_d2_frontier f
  1119. JOIN t_exposure e ON f.reached_sub = e.subsessionid
  1120. JOIN (SELECT DISTINCT exposure_id, return_subsessionid, sharedepth FROM t_share_return) sr
  1121. ON e.id = sr.exposure_id
  1122. JOIN t_exposure e_ret ON sr.return_subsessionid = e_ret.subsessionid
  1123. GROUP BY f.source_id
  1124. )
  1125. --========================================
  1126. -- 以下为原有 CTE 继续
  1127. --========================================
  1128. ,t_share_with_label AS
  1129. (
  1130. SELECT a.dthh
  1131. ,a.apptype -- join 条件
  1132. ,a.mid
  1133. ,a.vid -- join 条件
  1134. ,a.sessionid
  1135. ,a.subsessionid
  1136. ,a.pagesource
  1137. ,a.shareid -- join 条件
  1138. ,a.ts
  1139. ,a.exposure_id
  1140. ,COALESCE(b.return_1_pv,0) AS return_1_pv
  1141. ,COALESCE(b.return_1_uv,0) AS return_1_uv
  1142. ,b.return_1_mids AS return_1_mids -- 可能为null,再决策是否提前处理。
  1143. ,COALESCE(c.return_n_pv,0) AS return_n_pv
  1144. ,COALESCE(c.return_n_uv,0) AS return_n_uv
  1145. ,c.return_n_mids AS return_n_mids -- 可能为null,再决策是否提前处理。
  1146. ,COALESCE(c.new_exposure_cnt,0) AS new_exposure_cnt
  1147. FROM t_share_exposure a
  1148. LEFT JOIN (
  1149. SELECT shareid
  1150. ,vid
  1151. ,apptype
  1152. ,COUNT(1) AS return_1_pv
  1153. ,COUNT(DISTINCT mid) AS return_1_uv
  1154. ,CONCAT_WS(',',COLLECT_SET(mid)) AS return_1_mids
  1155. FROM t_return
  1156. GROUP BY shareid
  1157. ,vid
  1158. ,apptype
  1159. ) b
  1160. ON a.shareid = b.shareid
  1161. AND a.vid = b.vid
  1162. AND a.apptype = b.apptype
  1163. LEFT JOIN (
  1164. SELECT rootshareid
  1165. ,vid
  1166. ,apptype
  1167. ,COUNT(1) AS return_n_pv
  1168. ,COUNT(DISTINCT mid) AS return_n_uv
  1169. ,CONCAT_WS(',',COLLECT_SET(mid)) AS return_n_mids
  1170. ,SUM(new_exposure_cnt) AS new_exposure_cnt
  1171. FROM t_return_exposure
  1172. GROUP BY rootshareid
  1173. ,vid
  1174. ,apptype
  1175. ) c
  1176. ON a.shareid = c.rootshareid
  1177. AND a.vid = c.vid
  1178. AND a.apptype = c.apptype
  1179. )
  1180. ,t_share_with_label_group AS
  1181. (
  1182. SELECT exposure_id
  1183. ,COUNT(1) AS share_cnt
  1184. ,SUM(return_1_pv) AS return_1_pv
  1185. ,COALESCE(SIZE(SPLIT(DEDUPLICATION4LIST(CONCAT_WS(',',COLLECT_LIST(return_1_mids))),",")),0) AS return_1_uv
  1186. ,DEDUPLICATION4LIST(CONCAT_WS(',',COLLECT_LIST(return_1_mids))) AS return_1_mids -- 可能是null
  1187. ,SUM(return_n_pv) AS return_n_pv
  1188. ,COALESCE(SIZE(SPLIT(DEDUPLICATION4LIST(CONCAT_WS(',',COLLECT_LIST(return_n_mids))),",")),0) AS return_n_uv
  1189. ,DEDUPLICATION4LIST(CONCAT_WS(',',COLLECT_LIST(return_n_mids))) AS return_n_mids -- 可能是null
  1190. ,SUM(new_exposure_cnt) AS new_exposure_cnt
  1191. FROM t_share_with_label
  1192. GROUP BY exposure_id
  1193. )
  1194. ,t_root_source_id_group_name AS
  1195. (
  1196. SELECT *
  1197. FROM (
  1198. SELECT root_source_id
  1199. ,group_name
  1200. ,ROW_NUMBER() OVER (PARTITION BY root_source_id ) AS rn
  1201. FROM loghubods.changwen_rootsourceid_group_hour
  1202. WHERE dt = MAX_PT('loghubods.changwen_rootsourceid_group_hour')
  1203. )
  1204. WHERE rn = 1
  1205. )
  1206. ,t_exposure_share_return AS
  1207. (
  1208. SELECT apptype
  1209. ,uid
  1210. ,mid
  1211. ,vid
  1212. ,sessionid
  1213. ,subsessionid
  1214. ,pagesource
  1215. ,CASE WHEN pagesource REGEXP 'pages/user-videos-share-recommend$' THEN '回流后沉浸页&内页feed'
  1216. WHEN pagesource REGEXP 'pages/detail-recommend$' THEN '详情后沉浸页'
  1217. WHEN pagesource REGEXP 'pages/user-videos-share$' THEN '回流页'
  1218. WHEN pagesource REGEXP 'pages/user-videos-detail$' THEN '详情页'
  1219. WHEN pagesource REGEXP 'pages/category$' THEN '首页feed'
  1220. ELSE '其他'
  1221. END AS pagesource_new
  1222. ,recommendlogvo -- 推荐算法的返回结果日志存在这个字段中
  1223. ,abcode -- 推荐算法的ab分组
  1224. ,recommendpagetype -- 三种回流头部;两种下滑-沉浸页下滑和feed下滑
  1225. ,recomtraceid
  1226. ,headvideoid
  1227. ,rootsourceid
  1228. ,hotsencetype
  1229. ,flowpool -- 14#68#3#1735262438476#2
  1230. ,level
  1231. ,clientip
  1232. ,machineinfo_brand
  1233. ,machineinfo_model
  1234. ,machineinfo_system
  1235. ,machineinfo_wechatversion
  1236. ,machineinfo_sdkversion
  1237. ,province
  1238. ,city
  1239. ,ts
  1240. ,IF(COALESCE(share_cnt,0) > 0,1,0) AS is_share
  1241. ,COALESCE(share_cnt,0) AS share_cnt
  1242. ,IF(COALESCE(return_1_uv,0) > 0,1,0) AS is_return_1
  1243. ,COALESCE(return_1_pv,0) AS return_1_pv
  1244. ,COALESCE(return_1_uv,0) AS return_1_uv
  1245. ,IF(COALESCE(return_n_pv,0) > 0,1,0) AS is_return_n
  1246. ,COALESCE(return_n_pv,0) AS return_n_pv
  1247. ,COALESCE(return_n_uv,0) AS return_n_uv
  1248. ,IF(COALESCE(COALESCE(SIZE(ARRAY_REMOVE(SPLIT(return_1_mids,","),mid)),0),0) > 0,1,0) AS is_return_noself
  1249. ,COALESCE(SIZE(ARRAY_REMOVE(SPLIT(return_1_mids,","),mid)),0) AS return_1_uv_noself
  1250. ,IF(COALESCE(COALESCE(SIZE(ARRAY_REMOVE(SPLIT(return_n_mids,","),mid)),0),0) > 0,1,0) AS is_return_n_noself
  1251. ,COALESCE(SIZE(ARRAY_REMOVE(SPLIT(return_n_mids,","),mid)),0) AS return_n_uv_noself
  1252. ,COALESCE(new_exposure_cnt) AS new_exposure_cnt
  1253. -- ========== B 链 ==========
  1254. ,COALESCE(b_exp.bn_exp, 0) AS bn_exp
  1255. ,COALESCE(bn_hop.bn_pv, 0) AS bn_pv
  1256. ,COALESCE(SIZE(bn_hop.bn_mids), 0) AS bn_uv
  1257. ,COALESCE(b_exp.b1_exp, 0) AS b1_exp
  1258. ,COALESCE(bn_hop.b1_pv, 0) AS b1_pv
  1259. ,COALESCE(SIZE(bn_hop.b1_mids), 0) AS b1_uv
  1260. ,COALESCE(b_exp.b2_exp, 0) AS b2_exp
  1261. ,COALESCE(bn_hop.b2_pv, 0) AS b2_pv
  1262. ,COALESCE(SIZE(bn_hop.b2_mids), 0) AS b2_uv
  1263. ,COALESCE(b_exp.b3_exp, 0) AS b3_exp
  1264. ,COALESCE(bn_hop.b3_pv, 0) AS b3_pv
  1265. ,COALESCE(SIZE(bn_hop.b3_mids), 0) AS b3_uv
  1266. -- ========== C 链 hop1 ==========
  1267. ,COALESCE(c_hop1_exp.cn_1_exp, 0) AS cn_1_exp
  1268. ,COALESCE(c_hop1.cn_1_pv, 0) AS cn_1_pv
  1269. ,COALESCE(SIZE(c_hop1.cn_1_mids), 0) AS cn_1_uv
  1270. ,COALESCE(c_hop1_exp.c1_1_exp, 0) AS c1_1_exp
  1271. ,COALESCE(c_hop1.c1_1_pv, 0) AS c1_1_pv
  1272. ,COALESCE(SIZE(c_hop1.c1_1_mids), 0) AS c1_1_uv
  1273. ,COALESCE(c_hop1_exp.c2_1_exp, 0) AS c2_1_exp
  1274. ,COALESCE(c_hop1.c2_1_pv, 0) AS c2_1_pv
  1275. ,COALESCE(SIZE(c_hop1.c2_1_mids), 0) AS c2_1_uv
  1276. ,COALESCE(c_hop1_exp.c3_1_exp, 0) AS c3_1_exp
  1277. ,COALESCE(c_hop1.c3_1_pv, 0) AS c3_1_pv
  1278. ,COALESCE(SIZE(c_hop1.c3_1_mids), 0) AS c3_1_uv
  1279. -- ========== C 链 hop2 ==========
  1280. ,COALESCE(c_hop2_exp.cn_2_exp, 0) AS cn_2_exp
  1281. ,COALESCE(c_hop2.cn_2_pv, 0) AS cn_2_pv
  1282. ,COALESCE(SIZE(c_hop2.cn_2_mids), 0) AS cn_2_uv
  1283. ,COALESCE(c_hop2_exp.c1_2_exp, 0) AS c1_2_exp
  1284. ,COALESCE(c_hop2.c1_2_pv, 0) AS c1_2_pv
  1285. ,COALESCE(SIZE(c_hop2.c1_2_mids), 0) AS c1_2_uv
  1286. ,COALESCE(c_hop2_exp.c2_2_exp, 0) AS c2_2_exp
  1287. ,COALESCE(c_hop2.c2_2_pv, 0) AS c2_2_pv
  1288. ,COALESCE(SIZE(c_hop2.c2_2_mids), 0) AS c2_2_uv
  1289. ,COALESCE(c_hop2_exp.c3_2_exp, 0) AS c3_2_exp
  1290. ,COALESCE(c_hop2.c3_2_pv, 0) AS c3_2_pv
  1291. ,COALESCE(SIZE(c_hop2.c3_2_mids), 0) AS c3_2_uv
  1292. -- ========== C 链 hop3 ==========
  1293. ,COALESCE(c_hop3_exp.cn_3_exp, 0) AS cn_3_exp
  1294. ,COALESCE(c_hop3.cn_3_pv, 0) AS cn_3_pv
  1295. ,COALESCE(SIZE(c_hop3.cn_3_mids), 0) AS cn_3_uv
  1296. ,COALESCE(c_hop3_exp.c1_3_exp, 0) AS c1_3_exp
  1297. ,COALESCE(c_hop3.c1_3_pv, 0) AS c1_3_pv
  1298. ,COALESCE(SIZE(c_hop3.c1_3_mids), 0) AS c1_3_uv
  1299. ,COALESCE(c_hop3_exp.c2_3_exp, 0) AS c2_3_exp
  1300. ,COALESCE(c_hop3.c2_3_pv, 0) AS c2_3_pv
  1301. ,COALESCE(SIZE(c_hop3.c2_3_mids), 0) AS c2_3_uv
  1302. ,COALESCE(c_hop3_exp.c3_3_exp, 0) AS c3_3_exp
  1303. ,COALESCE(c_hop3.c3_3_pv, 0) AS c3_3_pv
  1304. ,COALESCE(SIZE(c_hop3.c3_3_mids), 0) AS c3_3_uv
  1305. -- ========== D 链 ==========
  1306. ,COALESCE(d0_hop.d0, 0) AS d0
  1307. -- D hop1
  1308. ,COALESCE(d_hop1_exp.dn_1_exp, 0) AS dn_1_exp
  1309. ,COALESCE(d_hop1.dn_1_pv, 0) AS dn_1_pv
  1310. ,COALESCE(SIZE(d_hop1.dn_1_mids), 0) AS dn_1_uv
  1311. ,COALESCE(d_hop1_exp.d1_1_exp, 0) AS d1_1_exp
  1312. ,COALESCE(d_hop1.d1_1_pv, 0) AS d1_1_pv
  1313. ,COALESCE(SIZE(d_hop1.d1_1_mids), 0) AS d1_1_uv
  1314. ,COALESCE(d_hop1_exp.d2_1_exp, 0) AS d2_1_exp
  1315. ,COALESCE(d_hop1.d2_1_pv, 0) AS d2_1_pv
  1316. ,COALESCE(SIZE(d_hop1.d2_1_mids), 0) AS d2_1_uv
  1317. ,COALESCE(d_hop1_exp.d3_1_exp, 0) AS d3_1_exp
  1318. ,COALESCE(d_hop1.d3_1_pv, 0) AS d3_1_pv
  1319. ,COALESCE(SIZE(d_hop1.d3_1_mids), 0) AS d3_1_uv
  1320. -- D hop2
  1321. ,COALESCE(d_hop2_exp.dn_2_exp, 0) AS dn_2_exp
  1322. ,COALESCE(d_hop2.dn_2_pv, 0) AS dn_2_pv
  1323. ,COALESCE(SIZE(d_hop2.dn_2_mids), 0) AS dn_2_uv
  1324. ,COALESCE(d_hop2_exp.d1_2_exp, 0) AS d1_2_exp
  1325. ,COALESCE(d_hop2.d1_2_pv, 0) AS d1_2_pv
  1326. ,COALESCE(SIZE(d_hop2.d1_2_mids), 0) AS d1_2_uv
  1327. ,COALESCE(d_hop2_exp.d2_2_exp, 0) AS d2_2_exp
  1328. ,COALESCE(d_hop2.d2_2_pv, 0) AS d2_2_pv
  1329. ,COALESCE(SIZE(d_hop2.d2_2_mids), 0) AS d2_2_uv
  1330. ,COALESCE(d_hop2_exp.d3_2_exp, 0) AS d3_2_exp
  1331. ,COALESCE(d_hop2.d3_2_pv, 0) AS d3_2_pv
  1332. ,COALESCE(SIZE(d_hop2.d3_2_mids), 0) AS d3_2_uv
  1333. -- D hop3
  1334. ,COALESCE(d_hop3_exp.dn_3_exp, 0) AS dn_3_exp
  1335. ,COALESCE(d_hop3.dn_3_pv, 0) AS dn_3_pv
  1336. ,COALESCE(SIZE(d_hop3.dn_3_mids), 0) AS dn_3_uv
  1337. ,COALESCE(d_hop3_exp.d1_3_exp, 0) AS d1_3_exp
  1338. ,COALESCE(d_hop3.d1_3_pv, 0) AS d1_3_pv
  1339. ,COALESCE(SIZE(d_hop3.d1_3_mids), 0) AS d1_3_uv
  1340. ,COALESCE(d_hop3_exp.d2_3_exp, 0) AS d2_3_exp
  1341. ,COALESCE(d_hop3.d2_3_pv, 0) AS d2_3_pv
  1342. ,COALESCE(SIZE(d_hop3.d2_3_mids), 0) AS d2_3_uv
  1343. ,COALESCE(d_hop3_exp.d3_3_exp, 0) AS d3_3_exp
  1344. ,COALESCE(d_hop3.d3_3_pv, 0) AS d3_3_pv
  1345. ,COALESCE(SIZE(d_hop3.d3_3_mids), 0) AS d3_3_uv
  1346. ,JSON_FORMAT(
  1347. JSON_OBJECT("animationSceneType",animationSceneType,"extParams",extParams,"rootsessionid",rootsessionid_new,"versioncode",versioncode,"group_name",tc.group_name)
  1348. ) AS extend
  1349. -- ========== mids 列表字段 (变长, 统一放末尾) ==========
  1350. ,return_1_mids
  1351. ,return_n_mids
  1352. ,ARRAY_JOIN(ARRAY_REMOVE(SPLIT(return_1_mids,","),mid),",") AS return_1_mids_noself
  1353. ,ARRAY_JOIN(ARRAY_REMOVE(SPLIT(return_n_mids,","),mid),",") AS return_n_mids_noself
  1354. ,CONCAT_WS(',', bn_hop.bn_mids) AS bn_mids
  1355. ,CONCAT_WS(',', bn_hop.b1_mids) AS b1_mids
  1356. ,CONCAT_WS(',', bn_hop.b2_mids) AS b2_mids
  1357. ,CONCAT_WS(',', bn_hop.b3_mids) AS b3_mids
  1358. ,CONCAT_WS(',', c_hop1.cn_1_mids) AS cn_1_mids
  1359. ,CONCAT_WS(',', c_hop1.c1_1_mids) AS c1_1_mids
  1360. ,CONCAT_WS(',', c_hop1.c2_1_mids) AS c2_1_mids
  1361. ,CONCAT_WS(',', c_hop1.c3_1_mids) AS c3_1_mids
  1362. ,CONCAT_WS(',', c_hop2.cn_2_mids) AS cn_2_mids
  1363. ,CONCAT_WS(',', c_hop2.c1_2_mids) AS c1_2_mids
  1364. ,CONCAT_WS(',', c_hop2.c2_2_mids) AS c2_2_mids
  1365. ,CONCAT_WS(',', c_hop2.c3_2_mids) AS c3_2_mids
  1366. ,CONCAT_WS(',', c_hop3.cn_3_mids) AS cn_3_mids
  1367. ,CONCAT_WS(',', c_hop3.c1_3_mids) AS c1_3_mids
  1368. ,CONCAT_WS(',', c_hop3.c2_3_mids) AS c2_3_mids
  1369. ,CONCAT_WS(',', c_hop3.c3_3_mids) AS c3_3_mids
  1370. ,CONCAT_WS(',', d_hop1.dn_1_mids) AS dn_1_mids
  1371. ,CONCAT_WS(',', d_hop1.d1_1_mids) AS d1_1_mids
  1372. ,CONCAT_WS(',', d_hop1.d2_1_mids) AS d2_1_mids
  1373. ,CONCAT_WS(',', d_hop1.d3_1_mids) AS d3_1_mids
  1374. ,CONCAT_WS(',', d_hop2.dn_2_mids) AS dn_2_mids
  1375. ,CONCAT_WS(',', d_hop2.d1_2_mids) AS d1_2_mids
  1376. ,CONCAT_WS(',', d_hop2.d2_2_mids) AS d2_2_mids
  1377. ,CONCAT_WS(',', d_hop2.d3_2_mids) AS d3_2_mids
  1378. ,CONCAT_WS(',', d_hop3.dn_3_mids) AS dn_3_mids
  1379. ,CONCAT_WS(',', d_hop3.d1_3_mids) AS d1_3_mids
  1380. ,CONCAT_WS(',', d_hop3.d2_3_mids) AS d2_3_mids
  1381. ,CONCAT_WS(',', d_hop3.d3_3_mids) AS d3_3_mids
  1382. ,SUBSTR(dthh,1,8) AS dt
  1383. ,SUBSTR(dthh,9,2) AS hh
  1384. FROM t_exposure ta
  1385. LEFT JOIN t_share_with_label_group tb
  1386. ON ta.id = tb.exposure_id
  1387. LEFT JOIN t_root_source_id_group_name tc
  1388. ON ta.rootsourceid = tc.root_source_id
  1389. LEFT JOIN t_exposure_bn bn_hop
  1390. ON ta.id = bn_hop.exposure_id
  1391. LEFT JOIN t_b_exp b_exp
  1392. ON ta.id = b_exp.exposure_id
  1393. LEFT JOIN t_d0 d0_hop
  1394. ON ta.id = d0_hop.exposure_id
  1395. LEFT JOIN t_c_hop1 c_hop1
  1396. ON ta.id = c_hop1.exposure_id
  1397. LEFT JOIN t_c_hop1_exp c_hop1_exp
  1398. ON ta.id = c_hop1_exp.exposure_id
  1399. LEFT JOIN t_c_hop2 c_hop2
  1400. ON ta.id = c_hop2.exposure_id
  1401. LEFT JOIN t_c_hop2_exp c_hop2_exp
  1402. ON ta.id = c_hop2_exp.exposure_id
  1403. LEFT JOIN t_c_hop3 c_hop3
  1404. ON ta.id = c_hop3.exposure_id
  1405. LEFT JOIN t_c_hop3_exp c_hop3_exp
  1406. ON ta.id = c_hop3_exp.exposure_id
  1407. LEFT JOIN t_d_hop1 d_hop1
  1408. ON ta.id = d_hop1.exposure_id
  1409. LEFT JOIN t_d_hop1_exp d_hop1_exp
  1410. ON ta.id = d_hop1_exp.exposure_id
  1411. LEFT JOIN t_d_hop2 d_hop2
  1412. ON ta.id = d_hop2.exposure_id
  1413. LEFT JOIN t_d_hop2_exp d_hop2_exp
  1414. ON ta.id = d_hop2_exp.exposure_id
  1415. LEFT JOIN t_d_hop3 d_hop3
  1416. ON ta.id = d_hop3.exposure_id
  1417. LEFT JOIN t_d_hop3_exp d_hop3_exp
  1418. ON ta.id = d_hop3_exp.exposure_id
  1419. )SELECT *
  1420. FROM t_exposure_share_return
  1421. ;