SQL
Subscription fitness
Users
Users model for subscription fitness.
source-preserved
Blocks
users.sql · 51 lines
inferred
-- models/users.sql
{{ config(materialized='view') }}
select cu.*
,case when (promotions_table.alias in ('<% parameter promo_trial %>','<% parameter promo_take3 %>','<% parameter promo_alias1 %>','<% parameter promo_alias2 %>'))
then date_add(date(pu.created_on), interval 8 day) else date(pu.created_on) end as created_adjusted
,pu.id
,pu.created_on as account_created_on
,pu.type
,pu.partner_id
,pu.status
,pu.complementary
,pu.activated_on
,pu.expiration_date
,w.zip
from users_table pu
left join venue_users cu on cu.user_id = pu.user_id
left join user_promotion user on cu.user_id = user.user_id
left join promotion_msa promotions_table on user.id = promotions_table.id
left join waitlist w on cu.email_id = w.email
where pu.type = 'company'
# models/schema.yml
version: 2
models:
- name: users
columns:
- name: passport_id
- name: user_id
tests:
- unique
- not_null
- name: first_name
- name: last_name
- name: email
- name: gender
- name: login_count
- name: created_adjusted
- name: activated_date
- name: expiration
- name: zip
- name: refund_exclusion
- name: partner_id
- name: status
- name: complementary
- name: has_expired
- name: reservation_cancellation_type
- name: reservation_status
- name: month_1
- name: month_2
Assumptions
- 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.
users.sql · 18 lines
source-preserved
validation: not checked
select cu.*
,case when (promotions_table.alias in ('<% parameter promo_trial %>','<% parameter promo_take3 %>','<% parameter promo_alias1 %>','<% parameter promo_alias2 %>'))
then date_add(date(pu.created_on), interval 8 day) else date(pu.created_on) end as created_adjusted
,pu.id
,pu.created_on as account_created_on
,pu.type
,pu.partner_id
,pu.status
,pu.complementary
,pu.activated_on
,pu.expiration_date
,w.zip
from users_table pu
left join venue_users cu on cu.user_id = pu.user_id
left join user_promotion user on cu.user_id = user.user_id
left join promotion_msa promotions_table on user.id = promotions_table.id
left join waitlist w on cu.email_id = w.email
where pu.type = 'company'
users.view.lkml · 255 lines
inferred
view: users {
derived_table: {
sql: select cu.*
,case when (promotions_table.alias in ('<% parameter promo_trial %>','<% parameter promo_take3 %>','<% parameter promo_alias1 %>','<% parameter promo_alias2 %>'))
then date_add(date(pu.created_on), interval 8 day) else date(pu.created_on) end as created_adjusted
,pu.id
,pu.created_on as account_created_on
,pu.type
,pu.partner_id
,pu.status
,pu.complementary
,pu.activated_on
,pu.expiration_date
,w.zip
from users_table pu
left join venue_users cu on cu.user_id = pu.user_id
left join user_promotion user on cu.user_id = user.user_id
left join promotion_msa promotions_table on user.id = promotions_table.id
left join waitlist w on cu.email_id = w.email
where pu.type = 'company' ;;
}
dimension: passport_id {
type: int
hidden: yes
sql: ${TABLE}.id ;;
}
dimension: user_id {
type: int
primary_key: yes
sql: ${TABLE}.user_id ;;
}
dimension: first_name {
sql: ${TABLE}.first_name ;;
}
dimension: last_name {
sql: ${TABLE}.last_name ;;
}
dimension: email {
sql: ${TABLE}.email_id ;;
}
dimension: gender {
sql: case
when ${TABLE}.gender = 'Unspecified' or ${TABLE}.gender is null then 'Unspecified'
else ${TABLE}.gender
end ;;
}
dimension: login_count {
type: number
sql: ${TABLE}.login_count ;;
}
dimension: created_adjusted {
type: time
sql: ${TABLE}.created_adjusted ;;
}
dimension: activated_date {
type: date
sql: ${TABLE}.activated_on ;;
}
dimension: expiration {
type: time
sql: ${TABLE}.expiration_date ;;
}
dimension: zip {
sql: ${TABLE}.zip ;;
}
dimension: refund_exclusion {
type: yesno
sql: DATEDIFF(${expiration_date}, DATE(${created_date})) <= 20 ;;
}
dimension: partner_id {
type: int
sql: ${TABLE}.partner_id ;;
}
dimension: status {
sql: ${TABLE}.status ;;
}
dimension: complementary {
type: yesno
sql: ${TABLE}.complementary ;;
}
dimension: has_expired {
type: yesno
sql: ${expiration_date} <= DATE(NOW()) ;;
}
dimension: reservation_cancellation_type {
type: yesno
sql: (${user_reservations.cancellation_type} in ('user_late_cancel', 'missed_class', 'missed_class_bookable') or ${user_reservations.cancellation_type} is null) ;;
}
dimension: reservation_status {
type: yesno
sql: (${user_reservations.status} != 'failed') ;;
}
dimension: month_1 {
type: yesno
sql: ((ROUND(DATEDIFF(${expiration_date}, ${created_adjusted_date})/30.42,0) >= 1 OR ${expiration_date} is NULL) AND ceil(datediff(now(), ${created_adjusted_date})/30.42) >=1) ;;
}
dimension: month_2 {
type: yesno
sql: ((ROUND(DATEDIFF(${expiration_date}, ${created_adjusted_date})/30.42,0) >= 2 OR ${expiration_date} is NULL) AND ceil(datediff(now(), ${created_adjusted_date})/30.42) >=2) ;;
}
dimension_group: last_logged_on {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.last_logged_on ;;
}
dimension_group: created {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.account_created_on ;;
}
measure: count {
type: count_distinct
drill_fields: [detail*]
sql: ${TABLE}.user_id ;;
}
measure: month_1_sum {
type: count
filters: [month_1: "True"]
}
measure: month_2_sum {
type: count
filters: [month_2: "True"]
}
measure: non_<% parameter promo_trial %>_ads {
type: count
filters: [created_adjusted_date: "this month"]
filters: [<% parameter promo_trial %>_url: "False"]
filters: [complementary: "False"]
}
measure: <% parameter promo_trial %>_conversion {
type: number
value_format: "0.0%"
sql: ${<% parameter promo_trial %>_users_converts}/NULLIF(${<% parameter promo_trial %>_user}, 0) ;;
}
measure: classes_per_<% parameter promo_trial %> {
type: number
value_format: "0.0"
sql: ${<% parameter promo_trial %>_class_count}/NULLIF(${<% parameter promo_trial %>_user}, 0) ;;
}
measure: count_expired_regular {
type: count
filters: [has_expired: "True"]
filters: [expiration_date: "this month"]
filters: [complementary: "False"]
filters: [<% parameter promo_trial %>_url: "False"]
}
measure: churned_this_month {
type: number
sql: ${count_expired_regular} + ${count_expired_<% parameter promo_trial %>} ;;
}
measure: gross_adds {
label: "Gross Adds This Montn"
type: number
sql: ${non_<% parameter promo_trial %>_ads} + ${<% parameter promo_trial %>_ads} ;;
}
measure: net_adds {
label: "Net Adds This Month"
type: number
sql: ${gross_adds} - ${churned_this_month} ;;
}
measure: mom_percent_growth {
label: "M-o-M Percent Growth"
type: number
value_format: "0.0%"
sql: ${user_count_month_to_date} / NULLIF(${last_month_count_actives}, 0)-1 ;;
}
measure: percent_churn {
label: "Percent Churn"
type: number
value_format: "0.0%"
sql: ${churned_this_month}/NULLIF(${last_month_count_actives}, 0) ;;
}
measure: last_month_count_actives {
label: "User Count Last Month"
type: max
filters: [created_adjusted_date: "last month"]
sql: ${monthly_user_stats.num_active_users_scorecard} ;;
}
measure: cumulative_count_active {
type: max
sql: ${monthly_user_stats.num_active_users_scorecard} ;;
}
measure: user_count_month_to_date {
label: "User Count Month To Date"
type: number
sql: case when ${last_month_count_actives} is null then ${net_adds} else ${last_month_count_actives} + ${net_adds} end ;;
}
measure: number_active_users_test {
type: number
sql: ${monthly_user_stats.num_active_users} ;;
}
measure: number_active_users_last_month {
type: number
sql: ${monthly_user_stats.num_active_users_last_month} ;;
}
measure: total_growth {
type: number
value_format: "0.0%"
sql: (${number_active_users_test}/${number_active_users_last_month}) -1 ;;
}
measure: share_percent_of_users_weekly {
description: "The number of users created that week for the medium category category from the waitlist divided by the total number of users created that week."
type: number
value_format: "0.0%"
sql: ${users.count}/${weekly_user_count.total_users} ;;
}
measure: share_percent_of_users_overall {
description: "The number of users created that weekfrom the waitlist divided by the total number of users created that week."
type: number
value_format: "0.0%"
sql: ${users.count}/${weekly_user_count.total_users} ;;
}
}
users.view.lookml · 182 lines
source-preserved
- view: users
derived_table:
sql: select cu.*
,case when (promotions_table.alias in ('<% parameter promo_trial %>','<% parameter promo_take3 %>','<% parameter promo_alias1 %>','<% parameter promo_alias2 %>'))
then date_add(date(pu.created_on), interval 8 day) else date(pu.created_on) end as created_adjusted
,pu.id
,pu.created_on as account_created_on
,pu.type
,pu.partner_id
,pu.status
,pu.complementary
,pu.activated_on
,pu.expiration_date
,w.zip
from users_table pu
left join venue_users cu on cu.user_id = pu.user_id
left join user_promotion user on cu.user_id = user.user_id
left join promotion_msa promotions_table on user.id = promotions_table.id
left join waitlist w on cu.email_id = w.email
where pu.type = 'company'
fields:
- dimension: passport_id
type: int
hidden: true
sql: ${TABLE}.id
- dimension: user_id
type: int
primary_key: true
sql: ${TABLE}.user_id
- dimension: first_name
sql: ${TABLE}.first_name
- dimension: last_name
sql: ${TABLE}.last_name
- dimension: email
sql: ${TABLE}.email_id
- dimension: gender
sql: case
when ${TABLE}.gender = 'Unspecified' or ${TABLE}.gender is null then 'Unspecified'
else ${TABLE}.gender
end
- dimension: login_count
type: number
sql: ${TABLE}.login_count
- dimension: created_adjusted
type: time
sql: ${TABLE}.created_adjusted
- dimension: activated_date
type: date
sql: ${TABLE}.activated_on
- dimension: expiration
type: time
sql: ${TABLE}.expiration_date
- dimension: zip
sql: ${TABLE}.zip
- dimension: refund_exclusion
type: yesno
sql: DATEDIFF(${expiration_date}, DATE(${created_date})) <= 20
- dimension: partner_id
type: int
sql: ${TABLE}.partner_id
- dimension: status
sql: ${TABLE}.status
- dimension: complementary
type: yesno
sql: ${TABLE}.complementary
- dimension: has_expired
type: yesno
sql: ${expiration_date} <= DATE(NOW())
- dimension: reservation_cancellation_type
type: yesno
sql: (${user_reservations.cancellation_type} in ('user_late_cancel', 'missed_class', 'missed_class_bookable') or ${user_reservations.cancellation_type} is null)
- dimension: reservation_status
type: yesno
sql: (${user_reservations.status} != 'failed')
- dimension: month_1
type: yesno
sql: ((ROUND(DATEDIFF(${expiration_date}, ${created_adjusted_date})/30.42,0) >= 1 OR ${expiration_date} is NULL) AND ceil(datediff(now(), ${created_adjusted_date})/30.42) >=1)
- dimension: month_2
type: yesno
sql: ((ROUND(DATEDIFF(${expiration_date}, ${created_adjusted_date})/30.42,0) >= 2 OR ${expiration_date} is NULL) AND ceil(datediff(now(), ${created_adjusted_date})/30.42) >=2)
- dimension_group: last_logged_on
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.last_logged_on
- dimension_group: created
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.account_created_on
- measure: count
type: count_distinct
drill_fields:
- detail*
sql: ${TABLE}.user_id
- measure: month_1_sum
type: count
filters:
- month_1: True
- measure: month_2_sum
type: count
filters:
- month_2: True
- measure: non_<% parameter promo_trial %>_ads
type: count
filters:
- created_adjusted_date: this month
- <% parameter promo_trial %>_url: False
- complementary: False
- measure: <% parameter promo_trial %>_conversion
type: number
value_format: '0.0%'
sql: ${<% parameter promo_trial %>_users_converts}/NULLIF(${<% parameter promo_trial %>_user}, 0)
- measure: classes_per_<% parameter promo_trial %>
type: number
value_format: 0.0
sql: ${<% parameter promo_trial %>_class_count}/NULLIF(${<% parameter promo_trial %>_user}, 0)
- measure: count_expired_regular
type: count
filters:
- has_expired: True
- expiration_date: this month
- complementary: False
- <% parameter promo_trial %>_url: False
- measure: churned_this_month
type: number
sql: ${count_expired_regular} + ${count_expired_<% parameter promo_trial %>}
- measure: gross_adds
type: number
label: Gross Adds This Montn
sql: ${non_<% parameter promo_trial %>_ads} + ${<% parameter promo_trial %>_ads}
- measure: net_adds
type: number
label: Net Adds This Month
sql: ${gross_adds} - ${churned_this_month}
- measure: mom_percent_growth
type: number
label: M-o-M Percent Growth
value_format: '0.0%'
sql: ${user_count_month_to_date} / NULLIF(${last_month_count_actives}, 0)-1
- measure: percent_churn
type: number
label: Percent Churn
value_format: '0.0%'
sql: ${churned_this_month}/NULLIF(${last_month_count_actives}, 0)
- measure: last_month_count_actives
type: max
label: User Count Last Month
filters:
- created_adjusted_date: last month
sql: ${monthly_user_stats.num_active_users_scorecard}
- measure: cumulative_count_active
type: max
sql: ${monthly_user_stats.num_active_users_scorecard}
- measure: user_count_month_to_date
type: number
label: User Count Month To Date
sql: case when ${last_month_count_actives} is null then ${net_adds} else ${last_month_count_actives} + ${net_adds} end
- measure: number_active_users_test
type: number
sql: ${monthly_user_stats.num_active_users}
- measure: number_active_users_last_month
type: number
sql: ${monthly_user_stats.num_active_users_last_month}
- measure: total_growth
type: number
value_format: '0.0%'
sql: (${number_active_users_test}/${number_active_users_last_month}) -1
- measure: share_percent_of_users_weekly
type: number
description: The number of users created that week for the medium category category from the waitlist divided by the total number of users created that week.
value_format: '0.0%'
sql: ${users.count}/${weekly_user_count.total_users}
- measure: share_percent_of_users_overall
type: number
description: The number of users created that weekfrom the waitlist divided by the total number of users created that week.
value_format: '0.0%'
sql: ${users.count}/${weekly_user_count.total_users}
Contents
- users.sql
- users.sql
- users.view.lkml
- users.view.lookml