high_consumption_materials_30d.sql 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. -- 最近 30 天高消耗素材聚合
  2. -- 日期窗口:2026-06-07 ~ 2026-07-06
  3. -- 目标:按 dynamic creative 聚合素材表现,用于归纳高消耗/高CTR素材方法论。
  4. WITH metric_day AS (
  5. SELECT creative_id
  6. ,dt
  7. ,valid_click_count
  8. ,view_count
  9. ,cost
  10. ,conversions_count
  11. ,key_page_view_count
  12. ,key_page_uv
  13. ,thousand_display_price
  14. FROM (
  15. SELECT creative_id
  16. ,dt
  17. ,valid_click_count
  18. ,view_count
  19. ,cost
  20. ,conversions_count
  21. ,key_page_view_count
  22. ,key_page_uv
  23. ,thousand_display_price
  24. ,ROW_NUMBER() OVER (PARTITION BY creative_id,dt ORDER BY update_time DESC) AS rn
  25. FROM loghubods.ad_put_tencent_creative_data_day
  26. WHERE dt >= '2026-06-07'
  27. AND dt <= '2026-07-06'
  28. AND creative_id IS NOT NULL
  29. ) t
  30. WHERE rn = 1
  31. ),
  32. metric_agg AS (
  33. SELECT creative_id
  34. ,MIN(dt) AS first_dt
  35. ,MAX(dt) AS last_dt
  36. ,COUNT(DISTINCT CASE WHEN cost > 0 THEN dt ELSE NULL END) AS active_days
  37. ,SUM(cost) / 100 AS cost_yuan
  38. ,SUM(view_count) AS view_count
  39. ,SUM(valid_click_count) AS valid_click_count
  40. ,SUM(key_page_view_count) AS key_page_view_count
  41. ,SUM(key_page_uv) AS key_page_uv
  42. ,SUM(conversions_count) AS conversions_count
  43. ,AVG(thousand_display_price) AS avg_thousand_display_price
  44. FROM metric_day
  45. GROUP BY creative_id
  46. ),
  47. latest_creative AS (
  48. SELECT account_id
  49. ,ad_id
  50. ,creative_id
  51. ,creative_name
  52. ,creative_status
  53. ,create_time AS creative_created_time
  54. FROM (
  55. SELECT c.account_id
  56. ,c.ad_id
  57. ,c.creative_id
  58. ,c.creative_name
  59. ,c.creative_status
  60. ,c.create_time
  61. ,ROW_NUMBER() OVER (PARTITION BY c.creative_id ORDER BY c.create_time DESC) AS rn
  62. FROM loghubods.ad_put_tencent_creative_day c
  63. JOIN metric_agg m
  64. ON c.creative_id = m.creative_id
  65. ) t
  66. WHERE rn = 1
  67. ),
  68. latest_component AS (
  69. SELECT creative_id
  70. ,MAX(page_spec) AS page_spec
  71. FROM loghubods.ad_put_tencent_creative_components
  72. WHERE page_type = 'PAGE_TYPE_WECHAT_MINI_PROGRAM'
  73. GROUP BY creative_id
  74. ),
  75. latest_ad AS (
  76. SELECT ad_id
  77. ,account_id
  78. ,ad_name
  79. ,create_time AS ad_create_time
  80. ,ad_status
  81. ,system_status AS ad_system_status
  82. ,optimization_goal
  83. ,bid_amount
  84. ,day_amount
  85. ,'' AS site_set
  86. ,targeting
  87. FROM (
  88. SELECT a.ad_id
  89. ,a.account_id
  90. ,a.ad_name
  91. ,a.create_time
  92. ,a.ad_status
  93. ,a.system_status
  94. ,a.optimization_goal
  95. ,a.bid_amount
  96. ,a.day_amount
  97. ,a.targeting
  98. ,ROW_NUMBER() OVER (PARTITION BY a.ad_id ORDER BY a.update_time DESC) AS rn
  99. FROM loghubods.ad_put_tencent_ad a
  100. JOIN latest_creative c
  101. ON a.ad_id = c.ad_id
  102. ) t
  103. WHERE rn = 1
  104. ),
  105. ad_package AS (
  106. SELECT ad_id
  107. ,package_id
  108. ,package_name
  109. ,min_people
  110. FROM (
  111. SELECT m.ad_id
  112. ,m.package_id
  113. ,p.package_name
  114. ,p.min_people
  115. ,ROW_NUMBER() OVER (PARTITION BY m.ad_id ORDER BY CAST(p.min_people AS BIGINT) ASC) AS rn
  116. FROM loghubods.ad_put_tencent_ad_package_mapping m
  117. LEFT JOIN loghubods.ad_put_tencent_package p
  118. ON m.package_id = p.tencent_audience_id
  119. JOIN latest_creative c
  120. ON m.ad_id = c.ad_id
  121. WHERE m.is_delete = 0
  122. ) t
  123. WHERE rn = 1
  124. ),
  125. creative_analysis AS (
  126. SELECT creative_id
  127. ,MAX(title) AS title
  128. ,MAX(image_url) AS image_url
  129. FROM loghubods.ad_put_tencent_creative_analysis
  130. GROUP BY creative_id
  131. )
  132. SELECT c.account_id
  133. ,c.ad_id
  134. ,a.ad_name
  135. ,m.creative_id
  136. ,c.creative_name
  137. ,SPLIT(SPLIT(GET_JSON_OBJECT(cp.page_spec,'$.wechat_mini_program_spec.mini_program_path'),'rootSourceId%3D')[1],'_')[3] AS video_id
  138. ,ca.title
  139. ,ca.image_url
  140. ,p.package_id
  141. ,p.package_name
  142. ,p.min_people
  143. ,a.optimization_goal
  144. ,a.bid_amount
  145. ,a.day_amount
  146. ,a.site_set
  147. ,a.ad_status
  148. ,a.ad_system_status
  149. ,c.creative_status
  150. ,m.first_dt
  151. ,m.last_dt
  152. ,m.active_days
  153. ,m.cost_yuan
  154. ,m.view_count
  155. ,m.valid_click_count
  156. ,CASE WHEN m.view_count > 0 THEN m.valid_click_count / m.view_count ELSE NULL END AS ctr
  157. ,m.key_page_view_count
  158. ,CASE WHEN m.valid_click_count > 0 THEN m.key_page_view_count / m.valid_click_count ELSE NULL END AS key_page_rate
  159. ,m.key_page_uv
  160. ,m.conversions_count
  161. ,CASE WHEN m.valid_click_count > 0 THEN m.conversions_count / m.valid_click_count ELSE NULL END AS conversion_rate
  162. ,m.avg_thousand_display_price
  163. FROM metric_agg m
  164. JOIN latest_creative c
  165. ON m.creative_id = c.creative_id
  166. LEFT JOIN latest_ad a
  167. ON c.ad_id = a.ad_id
  168. LEFT JOIN latest_component cp
  169. ON m.creative_id = cp.creative_id
  170. LEFT JOIN ad_package p
  171. ON c.ad_id = p.ad_id
  172. LEFT JOIN creative_analysis ca
  173. ON m.creative_id = ca.creative_id
  174. WHERE m.cost_yuan > 0
  175. ORDER BY m.cost_yuan DESC
  176. LIMIT 5000