カテゴリー: Uncategorized

  • Entry ASIN別に継続購入の買い回りを集計して合算する

    継続購入の買い回りをみてみる

    
    --以下2つのEntry ASINそれぞれに集計した後にUNION ALLで合算する
    --entryasin1
    --entryasin2
    -- allasinlist というテーブルを別途作成しアップロードしておいて販売してる全てのasinをリスト化しておく。自社で販売しているasinに限定してCustomer Lifetime Valueを計算する
     
    WITH
    -- Initial ASIN 1
    initial_purchases_1 AS (
        SELECT
            user_id,
            MIN(CONVERT_TIME_ZONE_FROM_UTC(event_date_utc, 'Asia/Tokyo')) AS first_purchase_date
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P60D', 'P1D')) -- Extend time window for initial purchases
        WHERE
            new_to_brand = TRUE
            AND tracked_asin = 'entryasin1'
            AND CONVERT_TIME_ZONE_FROM_UTC(event_date_utc, 'Asia/Tokyo') BETWEEN '2024-01-01' AND '2024-02-29'
        GROUP BY
            user_id
    ),
    repeat_purchases_1 AS (
        SELECT
            r.user_id,
            r.tracked_asin AS repeat_asin,
            'entryasin1' AS initial_asin, -- Initial ASIN 1
            SUM(r.total_product_sales) AS total_repeat_revenue,
            SUM(r.total_units_sold) AS total_repeat_units
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P300D', 'P1D')) r -- Extend time window for repeat purchases
        JOIN
            initial_purchases_1 i ON r.user_id = i.user_id
        JOIN
            allasinlist p ON r.tracked_asin = p.asin -- Filter repeat purchases by ASINs in external table
        WHERE
            r.new_to_brand = FALSE
            AND CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo') >= i.first_purchase_date
            AND SECONDS_BETWEEN(i.first_purchase_date, CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo')) <= 231 * 24 * 3600
            AND r.total_product_sales > 0
        GROUP BY
            r.user_id, r.tracked_asin
    ),
     
    -- Initial ASIN 2
    initial_purchases_2 AS (
        SELECT
            user_id,
            MIN(CONVERT_TIME_ZONE_FROM_UTC(event_date_utc, 'Asia/Tokyo')) AS first_purchase_date
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P60D', 'P1D')) -- Extend time window for initial purchases
        WHERE
            new_to_brand = TRUE
            AND tracked_asin = 'entryasin2'
            AND CONVERT_TIME_ZONE_FROM_UTC(event_date_utc, 'Asia/Tokyo') BETWEEN '2024-01-01' AND '2024-02-29'
        GROUP BY
            user_id
    ),
    repeat_purchases_2 AS (
        SELECT
            r.user_id,
            r.tracked_asin AS repeat_asin,
            'entryasin2' AS initial_asin, -- Initial ASIN 2
            SUM(r.total_product_sales) AS total_repeat_revenue,
            SUM(r.total_units_sold) AS total_repeat_units
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P300D', 'P1D')) r -- Extend time window for repeat purchases
        JOIN
            initial_purchases_2 i ON r.user_id = i.user_id
        JOIN
            allasinlist p ON r.tracked_asin = p.asin -- Filter repeat purchases by ASINs in external table
        WHERE
            r.new_to_brand = FALSE
            AND CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo') >= i.first_purchase_date
            AND SECONDS_BETWEEN(i.first_purchase_date, CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo')) <= 231 * 24 * 3600
            AND r.total_product_sales > 0
        GROUP BY
            r.user_id, r.tracked_asin
    )
     
    -- Union results for each ASIN
    SELECT initial_asin, repeat_asin, SUM(total_repeat_revenue) AS total_repeat_revenue, SUM(total_repeat_units) AS total_repeat_units
    FROM repeat_purchases_1
    GROUP BY initial_asin, repeat_asin
     
    UNION ALL
     
    SELECT initial_asin, repeat_asin, SUM(total_repeat_revenue) AS total_repeat_revenue, SUM(total_repeat_units) AS total_repeat_units
    FROM repeat_purchases_2
    GROUP BY initial_asin, repeat_asin;
    
  • Entry ASIN別にLTV Customer Lifetime Value (CLTV)算出

    entry asin別に一定期間(6週間とか)初回購入以降の継続購入を売上、個数で集計。
    時間が日本時間になっていないためCONVERT_TIME_ZONE_FROM_UTC(event_date_utc, ‘Asia/Tokyo’)をつかって日本時間に設定して全てを計算。

    --4ステップ展開
    --初回購入日から各user別に同じ日数で継続購入を集計するSQL文です
    --初回購入で評価したasinを限定列挙しておく。ここでは仮に
    entryasin1
    entryasin2
    entryasin3
    entryasin4
    の4つを想定(SQL文ではasinの値を''で囲んでください、↓例示)
    --自社で販売しているasinをリスト化してallasinlist というテーブルをアップロードしておく
    
    
    WITH initial_purchases AS (
        SELECT
            user_id,
            tracked_asin AS initial_asin, -- Track the ASIN for grouping purposes
            CAST(CONVERT_TIME_ZONE_FROM_UTC(MIN(event_date_utc), 'Asia/Tokyo') AS TIMESTAMP) AS first_purchase_date,
            COALESCE(SUM(total_product_sales), 0) AS total_initial_revenue, -- Sum of revenue for this ASIN
            COALESCE(SUM(total_units_sold), 0) AS initial_unit_count -- Sum of units sold for initial purchases
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P60D', 'P1D')) -- Keep window for Jan-Feb
        WHERE
            new_to_brand = TRUE
            AND CONVERT_TIME_ZONE_FROM_UTC(event_date_utc, 'Asia/Tokyo') BETWEEN '2024-01-01' AND '2024-02-29'
            AND tracked_asin IN ('entryasin1', 'entryasin2', 'entryasin3', 'entryasin4') -- Filter for specific ASINs
        GROUP BY
            user_id, tracked_asin -- Group by user_id and tracked_asin to ensure breakdown by ASIN
    ),
    
    -- Step 2: Repeat purchases with unit count, ensuring > 0 revenue for repeat purchases
    repeat_purchases AS (
        SELECT
            r.user_id,
            i.initial_asin, -- Include initial ASIN for grouping purposes
            COALESCE(SUM(r.total_product_sales), 0) AS total_repeat_revenue,
            COALESCE(SUM(r.total_units_sold), 0) AS repeat_unit_count -- Sum of units sold for repeat purchases
        FROM
            TABLE(EXTEND_TIME_WINDOW('conversions_all', 'P300D', 'P1D')) r -- Extended time window for repeat purchases
        JOIN
            initial_purchases i ON r.user_id = i.user_id -- Join on user_id
        JOIN
            allasinlist p ON r.tracked_asin = p.asin -- Filter repeat purchases by ASINs in external table
        WHERE
            r.new_to_brand = FALSE
            AND CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo') >= i.first_purchase_date
            AND CONVERT_TIME_ZONE_FROM_UTC(r.event_date_utc, 'Asia/Tokyo') <= '2024-11-25'
            AND r.total_product_sales > 0 -- Only include purchases with non-zero revenue
        GROUP BY
            r.user_id, i.initial_asin -- Group by user_id and initial ASIN
    )
    
    -- Step 3: Final output with ASIN breakdown using COUNT(DISTINCT)
    SELECT
        i.initial_asin, -- Group results by ASIN
        COUNT(DISTINCT i.user_id) AS initial_user_count, -- Exact count of distinct users for initial purchases
        COALESCE(SUM(i.total_initial_revenue), 0) AS total_initial_revenue, -- Total initial revenue
        COALESCE(SUM(i.initial_unit_count), 0) AS total_initial_units, -- Total initial units sold
        COALESCE(SUM(r.total_repeat_revenue), 0) AS total_repeat_revenue, -- Total repeat revenue
        COALESCE(SUM(r.repeat_unit_count), 0) AS total_repeat_units, -- Total repeat units sold
        COUNT(DISTINCT r.user_id) AS repeat_user_count -- Exact count of distinct users for repeat purchases
    FROM
        initial_purchases i
    LEFT JOIN
        repeat_purchases r ON i.user_id = r.user_id AND i.initial_asin = r.initial_asin -- Join on user_id and ASIN
    WHERE
        i.initial_asin IS NOT NULL
    GROUP BY
        i.initial_asin -- Group by initial ASIN;