SQL
Mobile ticketing
Active Users
Active Users model for mobile ticketing.
source-preserved
Blocks
active_users.sql · 33 lines
inferred
-- models/active_users.sql
{{ config(materialized='view') }}
WITH daily_use AS (
SELECT uid as user_id
,action
,DATE_TRUNC('day', start_date) as activity_date
FROM ts_user_base
)
SELECT daily_use.user_id
,daily_use.action
,wd.date as window_date
,daily_use.activity_date
FROM daily_use
,{{ ref('dates') }} AS wd
WHERE wd.date >= daily_use.activity_date
AND wd.date < daily_use.activity_date + interval '30 day'
AND {% condition activity_date %} daily_use.activity_date {% endcondition %}
AND {% condition window_date %} wd.date {% endcondition %}
# models/schema.yml
version: 2
models:
- name: active_users
columns:
- name: user_id
tests:
- unique
- not_null
- name: action
- name: active_day
- name: active_7_day
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.
active_users.sql · 16 lines
source-preserved
validation: not checked
WITH daily_use AS (
SELECT uid as user_id
,action
,DATE_TRUNC('day', start_date) as activity_date
FROM ts_user_base
)
SELECT daily_use.user_id
,daily_use.action
,wd.date as window_date
,daily_use.activity_date
FROM daily_use
,${dates.SQL_TABLE_NAME} AS wd
WHERE wd.date >= daily_use.activity_date
AND wd.date < daily_use.activity_date + interval '30 day'
AND {% condition activity_date %} daily_use.activity_date {% endcondition %}
AND {% condition window_date %} wd.date {% endcondition %}
active_users.view.lkml · 70 lines
inferred
view: active_users {
derived_table: {
sql: WITH daily_use AS (
SELECT uid as user_id
,action
,DATE_TRUNC('day', start_date) as activity_date
FROM ts_user_base
)
SELECT daily_use.user_id
,daily_use.action
,wd.date as window_date
,daily_use.activity_date
FROM daily_use
,${dates.SQL_TABLE_NAME} AS wd
WHERE wd.date >= daily_use.activity_date
AND wd.date < daily_use.activity_date + interval '30 day'
AND {% condition activity_date %} daily_use.activity_date {% endcondition %}
AND {% condition window_date %} wd.date {% endcondition %} ;;
}
dimension: user_id {
primary_key: yes
sql: ${TABLE}.user_id ;;
}
dimension: action {
sql: ${TABLE}.action ;;
}
dimension: active_day {
type: yesno
sql: ${TABLE}.activity_date = ${TABLE}.window_date ;;
}
dimension: active_7_day {
type: yesno
sql: (${TABLE}.window_date::date - ${TABLE}.activity_date::date) < 7 ;;
}
dimension_group: activity {
type: time
timeframes: [date, week, month, year]
convert_tz: no
sql: ${TABLE}.activity_date ;;
}
dimension_group: window {
type: time
timeframes: [date, week, month, year]
convert_tz: no
sql: ${TABLE}.window_date ;;
}
measure: user_count_active_this_day {
type: count_distinct
filters: [active_day: "True"]
sql: ${user_id} ;;
}
measure: user_count_active_7_days {
type: count_distinct
filters: [active_7_day: "True"]
sql: ${user_id} ;;
}
measure: user_count_active_30_days {
type: count_distinct
sql: ${user_id} ;;
}
}
active_users.view.lookml · 61 lines
source-preserved
- view: active_users
derived_table:
sql: WITH daily_use AS (
SELECT uid as user_id
,action
,DATE_TRUNC('day', start_date) as activity_date
FROM ts_user_base
)
SELECT daily_use.user_id
,daily_use.action
,wd.date as window_date
,daily_use.activity_date
FROM daily_use
,${dates.SQL_TABLE_NAME} AS wd
WHERE wd.date >= daily_use.activity_date
AND wd.date < daily_use.activity_date + interval '30 day'
AND {% condition activity_date %} daily_use.activity_date {% endcondition %}
AND {% condition window_date %} wd.date {% endcondition %}
fields:
- dimension: user_id
primary_key: true
sql: ${TABLE}.user_id
- dimension: action
sql: ${TABLE}.action
- dimension: active_day
type: yesno
sql: ${TABLE}.activity_date = ${TABLE}.window_date
- dimension: active_7_day
type: yesno
sql: (${TABLE}.window_date::date - ${TABLE}.activity_date::date) < 7
- dimension_group: activity
type: time
timeframes:
- date
- week
- month
- year
convert_tz: false
sql: ${TABLE}.activity_date
- dimension_group: window
type: time
timeframes:
- date
- week
- month
- year
convert_tz: false
sql: ${TABLE}.window_date
- measure: user_count_active_this_day
type: count_distinct
filters:
- active_day: True
sql: ${user_id}
- measure: user_count_active_7_days
type: count_distinct
filters:
- active_7_day: True
sql: ${user_id}
- measure: user_count_active_30_days
type: count_distinct
sql: ${user_id}
Contents
- active_users.sql
- active_users.sql
- active_users.view.lkml
- active_users.view.lookml