dbt Fitness gaming

User Engagement

User Engagement model for fitness gaming.

inferred

Blocks

user_engagement.sql · 29 lines
inferred
-- models/user_engagement.sql
{{ config(materialized='view') }}

SELECT
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7
  ELSE end_time_30 END as day,
  distinct_id as distinct_id,
  count(*) c
FROM log_out e
RIGHT JOIN {{ ref('date_table') }}
ON
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN
    my_date(time) >= start_time AND my_date(time) < end_time_7
  ELSE my_date(time) >= start_time AND my_date(time) < end_time_30
  END

WHERE e.game_total_distance >= 2 and {% condition country_code %} mp_country_code {% endcondition %}
AND
CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7 < now() ELSE end_time_30 < now() END
GROUP BY day, distinct_id

# models/schema.yml
version: 2

models:
  - name: user_engagement
    columns:
      - name: distinct_id
      - name: count_days

Assumptions

  • Each ${view.SQL_TABLE_NAME} was mapped to {{ ref('view') }}; confirm a dbt model exists for each referenced view.
  • materialized='view' is the default; no persist hint found.
  • schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
user_engagement.sql · 17 lines
source-preserved validation: not checked
SELECT
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7
  ELSE end_time_30 END as day,
  distinct_id as distinct_id,
  count(*) c
FROM log_out e
RIGHT JOIN ${date_table.SQL_TABLE_NAME}
ON
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN
    my_date(time) >= start_time AND my_date(time) < end_time_7
  ELSE my_date(time) >= start_time AND my_date(time) < end_time_30
  END

WHERE e.game_total_distance >= 2 and {% condition country_code %} mp_country_code {% endcondition %}
AND
CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7 < now() ELSE end_time_30 < now() END
GROUP BY day, distinct_id
user_engagement.view.lkml · 59 lines
inferred
view: user_engagement {
  derived_table: {
    sql: SELECT
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7
  ELSE end_time_30 END as day,
  distinct_id as distinct_id,
  count(*) c
FROM log_out e
RIGHT JOIN ${date_table.SQL_TABLE_NAME}
ON
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN
    my_date(time) >= start_time AND my_date(time) < end_time_7
  ELSE my_date(time) >= start_time AND my_date(time) < end_time_30
  END

WHERE e.game_total_distance >= 2 and {% condition country_code %} mp_country_code {% endcondition %}
AND
CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7 < now() ELSE end_time_30 < now() END
GROUP BY day, distinct_id ;;
  }

  dimension: distinct_id {
  }

  dimension: count_days {
    type: int
    sql: ${TABLE}.c ;;
  }

  dimension_group: ride {
    type: time
    timeframes: [time, date, week, month]
    sql: ${TABLE}.day ;;
  }

  measure: active_users {
    type: count
  }

  measure: 1_ride_users {
    type: count
    filters: [count_days: ">= 1"]
  }

  measure: 2_rides_users {
    type: count
    filters: [count_days: ">= 2"]
  }

  measure: 3_rides_users {
    type: count
    filters: [count_days: ">= 3"]
  }

  measure: 4_rides_users {
    type: count
    filters: [count_days: ">= 4"]
  }
}
user_engagement.view.lookml · 50 lines
source-preserved
- view: user_engagement
  derived_table:
    sql: SELECT
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7
  ELSE end_time_30 END as day,
  distinct_id as distinct_id,
  count(*) c
FROM log_out e
RIGHT JOIN ${date_table.SQL_TABLE_NAME}
ON
  CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN
    my_date(time) >= start_time AND my_date(time) < end_time_7
  ELSE my_date(time) >= start_time AND my_date(time) < end_time_30
  END

WHERE e.game_total_distance >= 2 and {% condition country_code %} mp_country_code {% endcondition %}
AND
CASE WHEN {% parameter number_of_trailing_days %} = '7' THEN end_time_7 < now() ELSE end_time_30 < now() END
GROUP BY day, distinct_id
  fields:
  - dimension: distinct_id
  - dimension: count_days
    type: int
    sql: ${TABLE}.c
  - dimension_group: ride
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.day
  - measure: active_users
    type: count
  - measure: 1_ride_users
    type: count
    filters:
    - count_days: '>= 1'
  - measure: 2_rides_users
    type: count
    filters:
    - count_days: '>= 2'
  - measure: 3_rides_users
    type: count
    filters:
    - count_days: '>= 3'
  - measure: 4_rides_users
    type: count
    filters:
    - count_days: '>= 4'

Contents

  • user_engagement.sql
  • user_engagement.sql
  • user_engagement.view.lkml
  • user_engagement.view.lookml