sir_pinski icon

Downloads Isolated Query

sir_pinski | PRO | 05/06/25 07:05:54 PM UTC | 0 ⭐ | 8834 👁️ | Never ⏰ | [Naavik]
SQL |

4.78 KB

|

None

|

0 👍

/

0 👎

-- ───────────────
-- DOWNLOADS ISOLATED
-- ───────────────
SELECT view_definition
FROM information_schema.views
WHERE TABLE_NAME = 'downloads_isolated'
 
CREATE OR REPLACE VIEW downloads_isolated AS
 
WITH
 
-- 1) Base list of download uplifts
du AS (
  SELECT app_id, start_date, num_days
  FROM downloads_uplifts
  WHERE (ww_period_units / num_days) > 10000 -- Filter out small datapoints with fewer than 10,000 daily downloads
),
 
-- 2) Per‐country pre/post averages & period sum (units)
per_country AS (
  SELECT
    du.app_id,
    du.start_date,
    du.num_days,
    rr.country,
    -- avg daily units before uplift
    SUM(rr.unified_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
            AND du.start_date - INTERVAL '1 day'
    ) AS sum_pre,
    -- avg daily units during uplift
    SUM(rr.unified_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date
            AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
    ) AS sum_period,
    -- total units during uplift
    SUM(rr.unified_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date + (du.num_days) * INTERVAL '1 day'
            AND du.start_date + (2*du.num_days - 1) * INTERVAL '1 day'
    ) AS sum_post
  FROM du
  JOIN revenue_raw AS rr
    ON rr.app_id = du.app_id
  GROUP BY du.app_id, du.start_date, du.num_days, rr.country
),
 
-- 3) Global total units during uplift (WW only)
global_period AS (
  SELECT
    du.app_id,
    du.start_date,
    du.num_days,
    SUM(rr.unified_units) AS ww_sum_period
  FROM du
  JOIN revenue_raw AS rr
    ON rr.app_id  = du.app_id
   AND rr.country = 'WW'                                           -- ← only WW
   AND CAST(rr.DATE AS DATE)
       BETWEEN du.start_date
           AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
  GROUP BY du.app_id, du.start_date, du.num_days
),
 
-- 4) Collect any “new region” codes
region_issues AS (
  SELECT
    pc.app_id,
    pc.start_date,
    pc.num_days,
    group_concat(pc.country, ',') AS region_list
  FROM per_country pc
  JOIN global_period gp
    USING (app_id, start_date, num_days)
  WHERE pc.sum_pre   = 0
    AND pc.sum_period >= 0.05 * gp.ww_sum_period  -- Make sure it's at least 5% of downloads
  GROUP BY pc.app_id, pc.start_date, pc.num_days
),
 
-- 5) Per‐platform sums & pre‐period sums (WW only)
per_platform AS (
  SELECT
    du.app_id,
    du.start_date,
    du.num_days,
 
    -- WW iOS units
    SUM(rr.ipad_units + rr.iphone_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
            AND du.start_date - INTERVAL '1 day'
    ) AS sum_pre_ios,
    SUM(rr.ipad_units + rr.iphone_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date
            AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
    ) AS sum_ios,
 
    -- WW Android units
    SUM(rr.android_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date - du.num_days * INTERVAL '1 day'
            AND du.start_date - INTERVAL '1 day'
    ) AS sum_pre_android,
    SUM(rr.android_units) FILTER (
      WHERE CAST(rr.DATE AS DATE)
        BETWEEN du.start_date
            AND du.start_date + (du.num_days - 1) * INTERVAL '1 day'
    ) AS sum_android
 
  FROM du
  JOIN revenue_raw AS rr
    ON rr.app_id  = du.app_id
   AND rr.country = 'WW'                                           -- ← only WW
  GROUP BY du.app_id, du.start_date, du.num_days
),
 
-- 6) Collect any “new platform” labels (sum-only version)
platform_issues AS (
  SELECT
    pp.app_id,
    pp.start_date,
    pp.num_days,
    GROUP_CONCAT(
      CASE
        WHEN pp.sum_pre_ios      = 0
         AND pp.sum_ios          >= 0.05 * (pp.sum_ios + pp.sum_android)
        THEN 'iOS'
        WHEN pp.sum_pre_android  = 0
         AND pp.sum_android      >= 0.05 * (pp.sum_ios + pp.sum_android)
        THEN 'Android'
      END,
    ',') AS platform_list
  FROM per_platform pp
  WHERE (pp.sum_pre_ios     = 0 AND pp.sum_ios     >= 0.05 * (pp.sum_ios + pp.sum_android))
     OR (pp.sum_pre_android = 0 AND pp.sum_android >= 0.05 * (pp.sum_ios + pp.sum_android))
  GROUP BY pp.app_id, pp.start_date, pp.num_days
)
 
 
-- 7) All uplifts + rejection flags
SELECT
  du.app_id,
  du.start_date,
  du.num_days,
  COALESCE(ri.region_list,   '') AS region_rejected,
  COALESCE(pi.platform_list, '') AS platform_rejected
FROM downloads_uplifts AS du
LEFT JOIN region_issues   AS ri USING (app_id, start_date, num_days)
LEFT JOIN platform_issues AS pi USING (app_id, start_date, num_days)
ORDER BY du.app_id, du.start_date;

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎