SQL
Gaming fantasy
User Monthly Activity
User Monthly Activity model for gaming fantasy.
source-preserved
Blocks
user_monthly_activity.sql · 44 lines
inferred
-- models/user_monthly_activity.sql
{{ config(materialized='view') }}
SELECT
{{ ref('userstatus') }}.UserId as UserId
, DATE_FORMAT({{ ref('userstatus') }}.firstleaguedate,'%Y-%m-01') as firstpaid_month
, month_list.activity_month as activity_month
, COALESCE(data.monthly_visits, 0) as monthly_visits
FROM
{{ ref('userstatus') }}
LEFT JOIN
(
SELECT
DISTINCT(DATE_FORMAT(CreatedDate,'%Y-%m-01')) as activity_month
FROM UserRegistration
) as month_list
ON DATE_FORMAT({{ ref('userstatus') }}.firstleaguedate,'%Y-%m-01') <= month_list.activity_month
LEFT JOIN
(
SELECT
UserId
, DATE_FORMAT(CreatedAt,'%Y-%m-01') as activity_month
, COUNT(distinct id) AS monthly_visits
, SUM(Amount) as Monthly_entryfees
FROM {{ ref('entry_fees') }}
GROUP BY 1,2
) as data
ON data.activity_month = month_list.activity_month
AND data.UserId = {{ ref('userstatus') }}.UserId
# models/schema.yml
version: 2
models:
- name: user_monthly_activity
columns:
- name: userid
- name: firstleaguemonth
- name: activity
- name: monthly_paidleagues
- name: months_since_firstleaguejoin
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_monthly_activity.sql · 29 lines
source-preserved
validation: not checked
SELECT
${userstatus.SQL_TABLE_NAME}.UserId as UserId
, DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') as firstpaid_month
, month_list.activity_month as activity_month
, COALESCE(data.monthly_visits, 0) as monthly_visits
FROM
${userstatus.SQL_TABLE_NAME}
LEFT JOIN
(
SELECT
DISTINCT(DATE_FORMAT(CreatedDate,'%Y-%m-01')) as activity_month
FROM UserRegistration
) as month_list
ON DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') <= month_list.activity_month
LEFT JOIN
(
SELECT
UserId
, DATE_FORMAT(CreatedAt,'%Y-%m-01') as activity_month
, COUNT(distinct id) AS monthly_visits
, SUM(Amount) as Monthly_entryfees
FROM ${entry_fees.SQL_TABLE_NAME}
GROUP BY 1,2
) as data
ON data.activity_month = month_list.activity_month
AND data.UserId = ${userstatus.SQL_TABLE_NAME}.UserId
user_monthly_activity.view.lkml · 76 lines
inferred
view: user_monthly_activity {
derived_table: {
sql: SELECT
${userstatus.SQL_TABLE_NAME}.UserId as UserId
, DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') as firstpaid_month
, month_list.activity_month as activity_month
, COALESCE(data.monthly_visits, 0) as monthly_visits
FROM
${userstatus.SQL_TABLE_NAME}
LEFT JOIN
(
SELECT
DISTINCT(DATE_FORMAT(CreatedDate,'%Y-%m-01')) as activity_month
FROM UserRegistration
) as month_list
ON DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') <= month_list.activity_month
LEFT JOIN
(
SELECT
UserId
, DATE_FORMAT(CreatedAt,'%Y-%m-01') as activity_month
, COUNT(distinct id) AS monthly_visits
, SUM(Amount) as Monthly_entryfees
FROM ${entry_fees.SQL_TABLE_NAME}
GROUP BY 1,2
) as data
ON data.activity_month = month_list.activity_month
AND data.UserId = ${userstatus.SQL_TABLE_NAME}.UserId ;;
}
dimension: userid {
sql: ${TABLE}.UserId ;;
}
dimension: firstleaguemonth {
label: "First League Join Month"
type: time
sql: ${TABLE}.firstpaid_month ;;
}
dimension: activity {
type: time
sql: ${TABLE}.activity_month ;;
}
dimension: monthly_paidleagues {
label: "Monthly Paid Leagues"
type: number
sql: ${TABLE}.monthly_visits ;;
}
dimension: months_since_firstleaguejoin {
type: number
sql: TIMESTAMPDIFF(MONTH, ${firstleaguemonth_raw}, ${activity_raw}) ;;
}
measure: total_users {
type: count_distinct
sql: ${userid} ;;
}
measure: active_users {
type: count_distinct
filters: [monthly_paidleagues: ">0"]
sql: ${userid} ;;
}
measure: percent_of_cohort_still_active {
type: number
value_format: "#.0\%"
sql: 100.0 * ${active_users} / nullif(${total_users},0) ;;
}
}
user_monthly_activity.view.lookml · 60 lines
source-preserved
- view: user_monthly_activity
derived_table:
sql: SELECT
${userstatus.SQL_TABLE_NAME}.UserId as UserId
, DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') as firstpaid_month
, month_list.activity_month as activity_month
, COALESCE(data.monthly_visits, 0) as monthly_visits
FROM
${userstatus.SQL_TABLE_NAME}
LEFT JOIN
(
SELECT
DISTINCT(DATE_FORMAT(CreatedDate,'%Y-%m-01')) as activity_month
FROM UserRegistration
) as month_list
ON DATE_FORMAT(${userstatus.SQL_TABLE_NAME}.firstleaguedate,'%Y-%m-01') <= month_list.activity_month
LEFT JOIN
(
SELECT
UserId
, DATE_FORMAT(CreatedAt,'%Y-%m-01') as activity_month
, COUNT(distinct id) AS monthly_visits
, SUM(Amount) as Monthly_entryfees
FROM ${entry_fees.SQL_TABLE_NAME}
GROUP BY 1,2
) as data
ON data.activity_month = month_list.activity_month
AND data.UserId = ${userstatus.SQL_TABLE_NAME}.UserId
fields:
- dimension: userid
sql: ${TABLE}.UserId
- dimension: firstleaguemonth
type: time
label: First League Join Month
sql: ${TABLE}.firstpaid_month
- dimension: activity
type: time
sql: ${TABLE}.activity_month
- dimension: monthly_paidleagues
type: number
label: Monthly Paid Leagues
sql: ${TABLE}.monthly_visits
- dimension: months_since_firstleaguejoin
type: number
sql: TIMESTAMPDIFF(MONTH, ${firstleaguemonth_raw}, ${activity_raw})
- measure: total_users
type: count_distinct
sql: ${userid}
- measure: active_users
type: count_distinct
filters:
- monthly_paidleagues: '>0'
sql: ${userid}
- measure: percent_of_cohort_still_active
type: number
value_format: '#.0\%'
sql: 100.0 * ${active_users} / nullif(${total_users},0)
Contents
- user_monthly_activity.sql
- user_monthly_activity.sql
- user_monthly_activity.view.lkml
- user_monthly_activity.view.lookml