Advertisement
sir_pinski

Downloads Isolated Query

May 6th, 2025
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 4.78 KB | None | 0 0
  1. -- ───────────────
  2. -- DOWNLOADS ISOLATED
  3. -- ───────────────
  4. SELECT view_definition
  5. FROM information_schema.views
  6. WHERE TABLE_NAME = 'downloads_isolated'
  7.  
  8. CREATE OR REPLACE VIEW downloads_isolated AS
  9.  
  10. WITH
  11.  
  12. -- 1) Base list of download uplifts
  13. du AS (
  14.   SELECT app_id, start_date, num_days
  15.   FROM downloads_uplifts
  16.   WHERE (ww_period_units / num_days) > 10000 -- Filter out small datapoints with fewer than 10,000 daily downloads
  17. ),
  18.  
  19. -- 2) Per‐country pre/post averages & period sum (units)
  20. per_country AS (
  21.   SELECT
  22.     du.app_id,
  23.     du.start_date,
  24.     du.num_days,
  25.     rr.country,
  26.     -- avg daily units before uplift
  27.     SUM(rr.unified_units) FILTER (
  28.       WHERE CAST(rr.DATE AS DATE)
  29.         BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
  30.             AND du.start_date - INTERVAL '1 day'
  31.     ) AS sum_pre,
  32.     -- avg daily units during uplift
  33.     SUM(rr.unified_units) FILTER (
  34.       WHERE CAST(rr.DATE AS DATE)
  35.         BETWEEN du.start_date
  36.             AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
  37.     ) AS sum_period,
  38.     -- total units during uplift
  39.     SUM(rr.unified_units) FILTER (
  40.       WHERE CAST(rr.DATE AS DATE)
  41.         BETWEEN du.start_date + (du.num_days) * INTERVAL '1 day'
  42.             AND du.start_date + (2*du.num_days - 1) * INTERVAL '1 day'
  43.     ) AS sum_post
  44.   FROM du
  45.   JOIN revenue_raw AS rr
  46.     ON rr.app_id = du.app_id
  47.   GROUP BY du.app_id, du.start_date, du.num_days, rr.country
  48. ),
  49.  
  50. -- 3) Global total units during uplift (WW only)
  51. global_period AS (
  52.   SELECT
  53.     du.app_id,
  54.     du.start_date,
  55.     du.num_days,
  56.     SUM(rr.unified_units) AS ww_sum_period
  57.   FROM du
  58.   JOIN revenue_raw AS rr
  59.     ON rr.app_id  = du.app_id
  60.    AND rr.country = 'WW'                                           -- ← only WW
  61.    AND CAST(rr.DATE AS DATE)
  62.        BETWEEN du.start_date
  63.            AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
  64.   GROUP BY du.app_id, du.start_date, du.num_days
  65. ),
  66.  
  67. -- 4) Collect any “new region” codes
  68. region_issues AS (
  69.   SELECT
  70.     pc.app_id,
  71.     pc.start_date,
  72.     pc.num_days,
  73.     group_concat(pc.country, ',') AS region_list
  74.   FROM per_country pc
  75.   JOIN global_period gp
  76.     USING (app_id, start_date, num_days)
  77.   WHERE pc.sum_pre   = 0
  78.     AND pc.sum_period >= 0.05 * gp.ww_sum_period  -- Make sure it's at least 5% of downloads
  79.   GROUP BY pc.app_id, pc.start_date, pc.num_days
  80. ),
  81.  
  82. -- 5) Per‐platform sums & pre‐period sums (WW only)
  83. per_platform AS (
  84.   SELECT
  85.     du.app_id,
  86.     du.start_date,
  87.     du.num_days,
  88.  
  89.     -- WW iOS units
  90.     SUM(rr.ipad_units + rr.iphone_units) FILTER (
  91.       WHERE CAST(rr.DATE AS DATE)
  92.         BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
  93.             AND du.start_date - INTERVAL '1 day'
  94.     ) AS sum_pre_ios,
  95.     SUM(rr.ipad_units + rr.iphone_units) FILTER (
  96.       WHERE CAST(rr.DATE AS DATE)
  97.         BETWEEN du.start_date
  98.             AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
  99.     ) AS sum_ios,
  100.  
  101.     -- WW Android units
  102.     SUM(rr.android_units) FILTER (
  103.       WHERE CAST(rr.DATE AS DATE)
  104.         BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
  105.             AND du.start_date - INTERVAL '1 day'
  106.     ) AS sum_pre_android,
  107.     SUM(rr.android_units) FILTER (
  108.       WHERE CAST(rr.DATE AS DATE)
  109.         BETWEEN du.start_date
  110.             AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
  111.     ) AS sum_android
  112.  
  113.   FROM du
  114.   JOIN revenue_raw AS rr
  115.     ON rr.app_id  = du.app_id
  116.    AND rr.country = 'WW'                                           -- ← only WW
  117.   GROUP BY du.app_id, du.start_date, du.num_days
  118. ),
  119.  
  120. -- 6) Collect any “new platform” labels (sum-only version)
  121. platform_issues AS (
  122.   SELECT
  123.     pp.app_id,
  124.     pp.start_date,
  125.     pp.num_days,
  126.     GROUP_CONCAT(
  127.       CASE
  128.         WHEN pp.sum_pre_ios      = 0
  129.          AND pp.sum_ios          >= 0.05 * (pp.sum_ios + pp.sum_android)
  130.         THEN 'iOS'
  131.         WHEN pp.sum_pre_android  = 0
  132.          AND pp.sum_android      >= 0.05 * (pp.sum_ios + pp.sum_android)
  133.         THEN 'Android'
  134.       END,
  135.     ',') AS platform_list
  136.   FROM per_platform pp
  137.   WHERE (pp.sum_pre_ios     = 0 AND pp.sum_ios     >= 0.05 * (pp.sum_ios + pp.sum_android))
  138.      OR (pp.sum_pre_android = 0 AND pp.sum_android >= 0.05 * (pp.sum_ios + pp.sum_android))
  139.   GROUP BY pp.app_id, pp.start_date, pp.num_days
  140. )
  141.  
  142.  
  143. -- 7) All uplifts + rejection flags
  144. SELECT
  145.   du.app_id,
  146.   du.start_date,
  147.   du.num_days,
  148.   COALESCE(ri.region_list,   '') AS region_rejected,
  149.   COALESCE(pi.platform_list, '') AS platform_rejected
  150. FROM downloads_uplifts AS du
  151. LEFT JOIN region_issues   AS ri USING (app_id, start_date, num_days)
  152. LEFT JOIN platform_issues AS pi USING (app_id, start_date, num_days)
  153. ORDER BY du.app_id, du.start_date;
Tags: Naavik
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement