简体   繁体   中英

How to calculate weekly retention in BigQuery using SQL

I have the following table with the week number and the retention rate.

|creation_week |num_engaged_users  |num_users_in_cohort |retention_rate|     
|:------------:|:-----------------:|:------------------:|:------------:|
|37|          373114              |4604                |67.637|
|38|          1860                |4604.               |40.4|   
|39|          1233                |4604                |26.781|
|40|          668                 |4604                |14.509|
|41|          450                 |4604                |9.774|
|42|                           463|                4604|10.056|

What I need is to make it look something like this

|week |week0 |week1 |week2|week3|week4|week5|week6|
|:---:|:----:|:----:|:---:|:---:|:---:|:---:|:---:|
|week37|100|ret.rate|ret.rate|ret.rate|ret.rate|ret.rate|ret.rate|
|week38|100|ret.rate|ret.rate|ret.rate|ret.rate|ret.rate|
|week39|100|ret.rate|ret.rate|ret.rate|ret.rate|
|week40|100|ret.rate|ret.rate|ret.rate|
|week41|100|ret.rate|ret.rate|
|week42|100|ret.rate|

how can I do that using BigQuery SQL?

For some reason Stackoverflow doesn't allow to post this question unless all the tables are marked as code...

I will provide the SQL code I used in the first answer because it doesn't let me post it either

WITH
  new_user_cohort AS (
  WITH
    #table with cookie and user_ids for the later matching
    table_1 AS (
    SELECT
      DISTINCT props.value.string_value AS cookie_id,
      user_id
    FROM
      `stockduel.analytics.events`,
      UNNEST(event_properties) AS props
    WHERE
      props.key = 'cookie_id'
      AND user_id>0),
    #second table which gives acess to the sample with the users who performed the event
    table_2 AS (
    SELECT
      DISTINCT props.value.string_value AS cookie_id,
      EXTRACT(WEEK
      FROM
        creation_date) AS first_week
    FROM
      `stockduel.analytics.events`,
      UNNEST(event_properties) AS props
    WHERE
      props.key = 'cookie_id'
      AND event_type = 'launch_first_time'
      #set the date from when starting cohort analysis
      AND EXTRACT(WEEK
      FROM
        creation_date) = EXTRACT(WEEK
      FROM
        DATE '2021-09-15'))
    #join user id with cookie_id and group the elements to remove the duplicates
  SELECT
    user_id,
    first_week
  FROM
    table_2
  JOIN
    table_1
  ON
    table_1.cookie_id = table_2.cookie_id
    #group the results to avoid duplicates
  GROUP BY
    user_id,
    first_week ),
  num_new_users AS (
  SELECT
    COUNT(*) AS num_users_in_cohort,
    first_week
  FROM
    new_user_cohort
  GROUP BY
    first_week ),
  engaged_users_by_day AS (
  SELECT
    COUNT(DISTINCT `stockduel.analytics.ws_raw_sessions_v2`.user_id) AS num_engaged_users,
    EXTRACT(WEEK
    FROM
      started_at) AS creation_week,
  FROM
    `stockduel.analytics.ws_raw_sessions_v2`
  JOIN
    new_user_cohort
  ON
    new_user_cohort.user_id = `stockduel.analytics.ws_raw_sessions_v2`.user_id
  WHERE
    EXTRACT(WEEK
    FROM
      started_at) BETWEEN EXTRACT(WEEK
    FROM
      DATE '2021-09-15')
    AND EXTRACT(WEEK
    FROM
      DATE '2021-10-22')
  GROUP BY
    creation_week )
SELECT
  creation_week,
  num_engaged_users,
  num_users_in_cohort,
  ROUND((100*(num_engaged_users / num_users_in_cohort)), 3) AS retention_rate
FROM
  engaged_users_by_day
CROSS JOIN
  num_new_users
ORDER BY
  creation_week

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM