From 8646706266426be4900732713ce526f4fba4729d Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 12 Apr 2016 14:14:53 -0400 Subject: [PATCH 1/9] update zuora sql model --- models/zuora/zuora_subscription.sql | 89 +++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 11 deletions(-) diff --git a/models/zuora/zuora_subscription.sql b/models/zuora/zuora_subscription.sql index ecae2de..362c00c 100644 --- a/models/zuora/zuora_subscription.sql +++ b/models/zuora/zuora_subscription.sql @@ -1,12 +1,79 @@ +with sub_mrr as ( select - id as subscr_id, - status as subscr_status, - termtype as subscr_term_type, - accountid as account_id, - contracteffectivedate::timestamp as subscr_start, - subscriptionenddate::timestamp as subscr_end, - name as subscr_name, - "version#392c30e6081c24fb78ddf6d622de4f33"::integer - as subscr_version, - * -from zuora.zuora_subscription + c.id as sub_id, + sum(cast(a.mrr as decimal(18,2))) as mrr +from zuora.zuora_rate_plan_charge a +join zuora.zuora_rate_plan b +on a.rateplanid = b.id +join zuora.zuora_subscription c +on b.subscriptionid = c.id +where a.islastsegment = true +group by 1 +), + +sub_billing_periods as ( +select + listagg(billingperiod,', ') within group (order by billingperiod) as billing_periods, + subscriptionid +from ( +select + distinct b.subscriptionid,a.billingperiod +from zuora.zuora_rate_plan_charge a +join zuora.zuora_rate_plan b +on a.rateplanid = b.id +where a.islastsegment = true +order by a.mrr desc +) +group by 2 +), + +sub_product_list as ( +select + listagg(product_with_quantity,', ') within group (order by mrr desc) as product_list, + subscriptionid +from ( +select + subscriptionid, + mrr, + name || ' (' || cast(quantity as integer) || ')' as product_with_quantity +from ( +select + distinct b.subscriptionid, + b.name, + a.mrr, + case + when a.quantity = 0 or a.quantity is null then 1 + else a.quantity + end as quantity +from zuora.zuora_rate_plan_charge a +join zuora.zuora_rate_plan b +on a.rateplanid = b.id +where a.islastsegment = true +) +) +group by 2 +) + +select + a.id as sub_id, + a.name as sub_name, + a.termtype, + a.status, + coalesce(lag(cast(b.effectivedate as date),1) over (partition by a.name order by cast(a."version#392c30e6081c24fb78ddf6d622de4f33" as integer)),cast(a.subscriptionstartdate as date)) as sub_effective_date, + cast(a.contracteffectivedate as date) as contract_effective_date, + cast(a.subscriptionstartdate as date) as sub_start_date, + cast(a.subscriptionenddate as date) as sub_end_date, + cast(a."version#392c30e6081c24fb78ddf6d622de4f33" as integer) as sub_version, + coalesce(c.mrr,0) as mrr, + d.billing_periods, + e.product_list, + a.accountid +from zuora.zuora_subscription a +left join zuora.zuora_amendment b +on a.id = b.subscriptionid +left join sub_mrr c +on a.id = c.sub_id +left join sub_billing_periods d +on a.id = d.subscriptionid +left join sub_product_list e +on a.id = e.subscriptionid From c4aaaa76efc46b2891c6cf804d00c9d355d0b34c Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 12 Apr 2016 14:51:39 -0400 Subject: [PATCH 2/9] update zuora subscriptions with charges and amendments model sql --- .../zuora_subscriptions_w_charges_and_amendments.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index 4da0efa..dc487ba 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -2,15 +2,15 @@ with subscr_w_amendments as ( select - account_number, acc.account_id, sub.subscr_id, - subscr_name, subscr_status, subscr_term_type, - subscr_start, subscr_end, subscr_version, amend_id, amend_start + account_number, acc.account_id, sub.sub_id, + sub_name, status, termtype, + sub_start_date, sub_end_date, sub_version, amend_id, amend_start from {{env.schema}}.zuora_account acc inner join {{env.schema}}.zuora_subscription sub - on acc.account_id = sub.account_id + on acc.account_id = sub.accountid -- add ammendments left outer join {{env.schema}}.zuora_amendment amend - on sub.subscr_id = amend.subscr_id + on sub.sub_id = amend.subscr_id ) select From 0a397bf2cf36dd383d1bc06883b433a4e03dea59 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Tue, 12 Apr 2016 15:22:19 -0400 Subject: [PATCH 3/9] update zuora sql modesla dn alter dbt_project yml to only build zuora models --- dbt_project.yml | 9 +++++---- .../zuora_subscriptions_w_charges_and_amendments.sql | 12 ++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dbt_project.yml b/dbt_project.yml index 1ab3d0d..bcfafbb 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -7,8 +7,9 @@ test-paths: ["test"] model-defaults: materialized: false - enabled: true + enabled: false -#models: -# zuora: -# materialized: true +models: + zuora: + enabled: true + materialized: false diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index dc487ba..fd84dcc 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -3,7 +3,7 @@ with subscr_w_amendments as ( select account_number, acc.account_id, sub.sub_id, - sub_name, status, termtype, + sub_name, sub.status, sub.termtype, sub_start_date, sub_end_date, sub_version, amend_id, amend_start from {{env.schema}}.zuora_account acc inner join {{env.schema}}.zuora_subscription sub @@ -14,14 +14,14 @@ with subscr_w_amendments as ) select - account_number, account_id, sub.subscr_id, - subscr_name, subscr_status, subscr_term_type, - subscr_start, subscr_end, subscr_version, amend_id, amend_start, + account_number, sub.account_id, sub.sub_id, + sub.sub_name, sub.status, sub.termtype, + sub.sub_start_date, sub.sub_end_date, sub.sub_version, amend_id, amend_start, rpc_start, rpc_end, rpc_last_segment, - min(subscr_start) over() as first_subscr, + min(sub.sub_start_date) over() as first_subscr, "@mrr" as mrr from subscr_w_amendments sub inner join {{env.schema}}.zuora_rate_plan rp - on rp.subscr_id = sub.subscr_id + on rp.subscr_id = sub.sub_id inner join {{env.schema}}.zuora_rate_plan_charge rpc on rpc.rate_plan_id = rp.rate_plan_id From 153be59c738d00e6cd4850f79716d3cc37c6d8f9 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 14:30:22 -0400 Subject: [PATCH 4/9] more zuora subscription model updates --- models/zuora/zuora_subscription.sql | 153 +++++++++++++----- ...subscriptions_w_charges_and_amendments.sql | 4 +- 2 files changed, 118 insertions(+), 39 deletions(-) diff --git a/models/zuora/zuora_subscription.sql b/models/zuora/zuora_subscription.sql index 362c00c..65f6e15 100644 --- a/models/zuora/zuora_subscription.sql +++ b/models/zuora/zuora_subscription.sql @@ -1,55 +1,99 @@ with sub_mrr as ( select c.id as sub_id, - sum(cast(a.mrr as decimal(18,2))) as mrr + sum(cast(a.mrr as decimal(18,2))) as mrr, + sum(cast(a.tcv as decimal(18,2))) as tcv from zuora.zuora_rate_plan_charge a join zuora.zuora_rate_plan b on a.rateplanid = b.id join zuora.zuora_subscription c on b.subscriptionid = c.id -where a.islastsegment = true +where a.islastsegment = TRUE group by 1 ), -sub_billing_periods as ( -select - listagg(billingperiod,', ') within group (order by billingperiod) as billing_periods, +sub_billing_periods AS ( +SELECT + listagg(billingperiod,', ') WITHIN GROUP (ORDER BY billingperiod) AS billing_periods, subscriptionid -from ( -select - distinct b.subscriptionid,a.billingperiod -from zuora.zuora_rate_plan_charge a -join zuora.zuora_rate_plan b -on a.rateplanid = b.id -where a.islastsegment = true +FROM ( +SELECT + DISTINCT b.subscriptionid,a.billingperiod +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE order by a.mrr desc ) -group by 2 +GROUP BY 2 +), + +sub_charge_types AS ( +SELECT + listagg(chargetype,', ') WITHIN GROUP (ORDER BY chargetype) AS charge_types, + subscriptionid +FROM ( +SELECT + DISTINCT b.subscriptionid,a.chargetype +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +order by a.mrr desc +) +GROUP BY 2 +), + +sub_charge_models AS ( +SELECT + listagg(chargemodel,', ') WITHIN GROUP (ORDER BY chargemodel) AS charge_models, + subscriptionid +FROM ( +SELECT + DISTINCT b.subscriptionid,a.chargemodel +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +order by a.mrr desc +) +GROUP BY 2 ), -sub_product_list as ( +sub_distinct_rate_plans as ( select - listagg(product_with_quantity,', ') within group (order by mrr desc) as product_list, + listagg(name,', ') WITHIN GROUP (ORDER BY name DESC) AS distinct_rate_plans, subscriptionid from ( +SELECT + DISTINCT b.subscriptionid, + b.name +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +) +group by 2 +), + +sub_distinct_products as ( select - subscriptionid, - mrr, - name || ' (' || cast(quantity as integer) || ')' as product_with_quantity + listagg(name,', ') WITHIN GROUP (ORDER BY name DESC) AS distinct_products, + subscriptionid from ( -select - distinct b.subscriptionid, - b.name, - a.mrr, - case - when a.quantity = 0 or a.quantity is null then 1 - else a.quantity - end as quantity -from zuora.zuora_rate_plan_charge a -join zuora.zuora_rate_plan b -on a.rateplanid = b.id -where a.islastsegment = true -) +SELECT + DISTINCT b.subscriptionid, + e.name +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +join zuora.zuora_product_rate_plan_charge c +on a.productrateplanchargeid = c.id +join zuora.zuora_product_rate_plan d +on c.productrateplanid = d.id +join zuora.zuora_product e +on d.productid = e.id +where a.islastsegment = TRUE ) group by 2 ) @@ -57,17 +101,46 @@ group by 2 select a.id as sub_id, a.name as sub_name, - a.termtype, + a.termtype as term_type, a.status, - coalesce(lag(cast(b.effectivedate as date),1) over (partition by a.name order by cast(a."version#392c30e6081c24fb78ddf6d622de4f33" as integer)),cast(a.subscriptionstartdate as date)) as sub_effective_date, + a.renewalsetting as renewal_setting, + a.isinvoiceseparate as is_invoice_separate, + a.currenttermperiodtype as current_term_period_type, + coalesce(lag(cast(b.effectivedate as date),1) over (partition by a.name order by cast(a.version#392c30e6081c24fb78ddf6d622de4f33 as integer)),cast(a.subscriptionstartdate as date)) as sub_effective_date, + cast(a.contractacceptancedate as date) as contract_acceptance_date, cast(a.contracteffectivedate as date) as contract_effective_date, cast(a.subscriptionstartdate as date) as sub_start_date, cast(a.subscriptionenddate as date) as sub_end_date, - cast(a."version#392c30e6081c24fb78ddf6d622de4f33" as integer) as sub_version, + cast(a.termstartdate as date) as term_start_date, + cast(a.termenddate as date) as term_end_date, + cast(a.cancelleddate as date) as cancelled_date, + cast(a.createddate as timestamp) as created_date, + cast(a.updateddate as timestamp) as updated_date, + cast(a.originalcreateddate as timestamp) as original_created_date, + cast(a.serviceactivationdate as date) as service_activation_date, + cast(a.version#392c30e6081c24fb78ddf6d622de4f33 as integer) as sub_version, coalesce(c.mrr,0) as mrr, + coalesce(c.tcv,0) as tcv, d.billing_periods, - e.product_list, - a.accountid + f.charge_types, + g.charge_models, + h.distinct_products, + e.distinct_rate_plans, + a.accountid as account_id, + a.invoiceownerid as invoice_owner_id, + a.createdbyid as created_by_id, + a.updatedbyid as updated_by_id, + a.autorenew as auto_renew, + a.renewaltermperiodtype as renewal_term_period_type, + cast(a."renewalterm#d6921dfe0b38e14b10fb11fbb53af737" as integer) as renewal_term, + cast(a."currentterm#43cd92dff45a80fd1ab8e39f16b6af51" as integer) as current_term, + a.initialtermperiodtype as initial_term_period_type, + cast(a."initialterm#58b70e8fe6414e59d8d03a9eb211ab74" as integer) as initial_term, + a.previoussubscriptionid as previous_subscription_id, + a.originalid as original_id, + a.notes, + a.creatoraccountid as creator_account_id, + a.creatorinvoiceownerid as creator_invoice_owner_id from zuora.zuora_subscription a left join zuora.zuora_amendment b on a.id = b.subscriptionid @@ -75,5 +148,11 @@ left join sub_mrr c on a.id = c.sub_id left join sub_billing_periods d on a.id = d.subscriptionid -left join sub_product_list e +left join sub_distinct_rate_plans e on a.id = e.subscriptionid +left join sub_charge_types f +on a.id = f.subscriptionid +left join sub_charge_models g +on a.id = g.subscriptionid +left join sub_distinct_products h +on a.id = h.subscriptionid diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index fd84dcc..e030174 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -3,11 +3,11 @@ with subscr_w_amendments as ( select account_number, acc.account_id, sub.sub_id, - sub_name, sub.status, sub.termtype, + sub_name, sub.status, sub.term_type, sub_start_date, sub_end_date, sub_version, amend_id, amend_start from {{env.schema}}.zuora_account acc inner join {{env.schema}}.zuora_subscription sub - on acc.account_id = sub.accountid + on acc.account_id = sub.account_id -- add ammendments left outer join {{env.schema}}.zuora_amendment amend on sub.sub_id = amend.subscr_id From 908d1abf0f9842384146f6483d8b40d29012d056 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 14:34:47 -0400 Subject: [PATCH 5/9] small fix to subscription w charges and amendments model --- models/zuora/zuora_subscriptions_w_charges_and_amendments.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index e030174..1c2a4db 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -15,7 +15,7 @@ with subscr_w_amendments as select account_number, sub.account_id, sub.sub_id, - sub.sub_name, sub.status, sub.termtype, + sub.sub_name, sub.status, sub.term_type, sub.sub_start_date, sub.sub_end_date, sub.sub_version, amend_id, amend_start, rpc_start, rpc_end, rpc_last_segment, min(sub.sub_start_date) over() as first_subscr, From 7eda66149c16ce4a7fe8a25fd684765e25d70f82 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 15:08:24 -0400 Subject: [PATCH 6/9] add an analysis template for zuora new business metrics --- analysis/zuora/new_business_metrics.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 analysis/zuora/new_business_metrics.sql diff --git a/analysis/zuora/new_business_metrics.sql b/analysis/zuora/new_business_metrics.sql new file mode 100644 index 0000000..f481e79 --- /dev/null +++ b/analysis/zuora/new_business_metrics.sql @@ -0,0 +1,16 @@ +select + sum(mrr) as gross_new_mrr, + sum(mrr)-lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)) as delta_gross_new_mrr, + ((sum(mrr)-lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)))/lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)))*100 as percent_gross_new_mrr_growth, + sum(mrr)*12 as gross_new_arr, + sum(tcv) as gross_new_bookings, + count(1) as gross_new_subscriptions, + count(distinct account_id) as gross_new_accounts, + avg(mrr) as avg_new_subscription_mrr, + avg(tcv) as avg_contract_value, + avg(datediff(months,sub_start_date,sub_end_date)) as avg_new_subscription_length, + date_trunc('month',contract_effective_date) as date +from {{env.schema}}.zuora_subscription +where sub_version = 1 +group by date_trunc('month',contract_effective_date) +order by date_trunc('month',contract_effective_date) From c1625f6e8702b068c9b705855ddd2740f3f5c706 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 15:10:06 -0400 Subject: [PATCH 7/9] reset dbt_project.yml to defaults --- dbt_project.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dbt_project.yml b/dbt_project.yml index bcfafbb..e739b67 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -7,9 +7,9 @@ test-paths: ["test"] model-defaults: materialized: false - enabled: false + enabled: true -models: - zuora: - enabled: true - materialized: false +##models: +## zuora: +## enabled: true +## materialized: false From ca70f428b2b7e906410f6c7e2cfe0081d609496f Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 16:01:13 -0400 Subject: [PATCH 8/9] updates to yevgeniys mrr analyses to make sure they work with new model --- analysis/mrr/active_mrr.sql | 4 ++-- analysis/mrr/total_mrr_by_month.sql | 16 ++++++++-------- ...ra_subscriptions_w_charges_and_amendments.sql | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/analysis/mrr/active_mrr.sql b/analysis/mrr/active_mrr.sql index b07f11a..ff07dfe 100644 --- a/analysis/mrr/active_mrr.sql +++ b/analysis/mrr/active_mrr.sql @@ -5,7 +5,7 @@ charges_for_active_plans as from {{env.schema}}.zuora_subscriptions_w_charges_and_amendments where -- make sure the subscription is active - subscr_status = 'Active' + sub_status = 'Active' and ( -- make sure the rate plan charge is current @@ -14,7 +14,7 @@ charges_for_active_plans as and rpc_end >= current_date ) - or subscr_term_type = 'EVERGREEN' + or sub_term_type = 'EVERGREEN' ) and rpc_last_segment = TRUE ) diff --git a/analysis/mrr/total_mrr_by_month.sql b/analysis/mrr/total_mrr_by_month.sql index 0b618d8..6aee47c 100644 --- a/analysis/mrr/total_mrr_by_month.sql +++ b/analysis/mrr/total_mrr_by_month.sql @@ -24,11 +24,11 @@ charges_up_to_each_date as ( select date_day, date_month, account_number, mrr, rpc_start, rpc_end, rpc_last_segment, - amend_start, amend_id, subscr_term_type, subscr_start, subscr_end, subscr_id, - subscr_name, subscr_version, + amend_start, amend_id, sub_term_type, sub_start_date, sub_end_date, sub_id, + sub_name, sub_version, dateadd(month,1,date_month) as date_month_plus_one, max(date_day) over (partition by subscr_name, dateadd(month,1,date_month)) as max_subscr_trunc_date, - max(subscr_version) over (partition by subscr_name, date_month) as max_subscr_version_within_date + max(sub_version) over (partition by sub_name, date_month) as max_subscr_version_within_date from dates a left join subscriptions b on 1=1 @@ -58,13 +58,13 @@ all_charges_by_month as ) or ( - subscr_term_type = 'EVERGREEN' - and subscr_start <= dateadd(month, 1, date_month) + sub_term_type = 'EVERGREEN' + and sub_start_date <= dateadd(month, 1, date_month) and ( - subscr_end is null + sub_end_date is null or - subscr_end >= dateadd(month, 1, date_month) + sub_end_date >= dateadd(month, 1, date_month) ) and ( @@ -75,7 +75,7 @@ all_charges_by_month as ) ) and date_day = max_subscr_trunc_date - and subscr_version = max_subscr_version_within_date + and sub_version = max_subscr_version_within_date and dateadd(month, 1, date_month) <= current_date ) diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index 1c2a4db..c7c4047 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -15,7 +15,7 @@ with subscr_w_amendments as select account_number, sub.account_id, sub.sub_id, - sub.sub_name, sub.status, sub.term_type, + sub.sub_name, sub.status as sub_status, sub.term_type as sub_term_type, sub.sub_start_date, sub.sub_end_date, sub.sub_version, amend_id, amend_start, rpc_start, rpc_end, rpc_last_segment, min(sub.sub_start_date) over() as first_subscr, From d7af70b8973f13c6412809628e134021de4c9e78 Mon Sep 17 00:00:00 2001 From: David Wallace Date: Wed, 13 Apr 2016 16:11:12 -0400 Subject: [PATCH 9/9] adjust yevgeniys total_mrr_by_month analysis to accommodate new zuora_subscription model --- analysis/mrr/total_mrr_by_month.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis/mrr/total_mrr_by_month.sql b/analysis/mrr/total_mrr_by_month.sql index 6aee47c..82168d8 100644 --- a/analysis/mrr/total_mrr_by_month.sql +++ b/analysis/mrr/total_mrr_by_month.sql @@ -27,7 +27,7 @@ charges_up_to_each_date as amend_start, amend_id, sub_term_type, sub_start_date, sub_end_date, sub_id, sub_name, sub_version, dateadd(month,1,date_month) as date_month_plus_one, - max(date_day) over (partition by subscr_name, dateadd(month,1,date_month)) as max_subscr_trunc_date, + max(date_day) over (partition by sub_name, dateadd(month,1,date_month)) as max_subscr_trunc_date, max(sub_version) over (partition by sub_name, date_month) as max_subscr_version_within_date from dates a left join subscriptions b