dbt
Fintech api
Growth Client Info
Growth Client Info model for fintech api.
inferred
Blocks
growth_client_info.sql · 102 lines
inferred
-- models/growth_client_info.sql
{{ config(materialized='table') }}
SELECT
ap.client_id as client_id,
ap.client_name as client_name,
-- revenue history
pp.revenue_first as revenue_first,
pp.revenue_last as revenue_last,
pp.revenue_lifetime as revenue_lifetime,
-- request history
MIN(ap.current_time_ms) as requests_first,
MAX(ap.current_time_ms) as requests_last,
COUNT(*) as requests_lifetime,
-- pay-per-request, auth
COUNT(CASE WHEN ap.utilization_metric='auth-submit' THEN 1 END) as auth_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='auth-get' THEN 1 END) as auth_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='auth' THEN ap.occurrence_id END) as auth_distinct_oids,
-- pay-per-request, info
COUNT(CASE WHEN ap.utilization_metric='info-submit' THEN 1 END) as info_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='info-get' THEN 1 END) as info_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='info' THEN ap.occurrence_id END) as info_distinct_oids,
-- pay-per-account, balance
COUNT(CASE WHEN ap.utilization_metric='auth-delete' THEN 1 END) as auth_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='balance' THEN 1 END) as balance_requests,
COUNT(DISTINCT CASE WHEN ap.product_category IN ('auth','balance') THEN ap.occurrence_id END) as balance_distinct_oids,
-- pay-per-account, connect
COUNT(CASE WHEN ap.utilization_metric='connect-submit' THEN 1 END) as connect_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-delete' THEN 1 END) as connect_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-get' THEN 1 END) as connect_get_requests,
COUNT(CASE WHEN ap.utilization_metric='upgrade' THEN 1 END) as upgrade_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='connect' THEN ap.occurrence_id END) as connect_distinct_oids
FROM
api_production ap
LEFT OUTER JOIN (
SELECT
p.client_id as client_id,
MIN(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_first,
MAX(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_last,
SUM(p.amount) as revenue_lifetime
FROM
production_audit p
GROUP BY
p.client_id
) as pp
ON
pp.client_id=ap.client_id
WHERE
ap.client_name NOT IN ('test','financial_api_provider','carl')
GROUP BY
ap.client_id,
ap.client_name,
pp.revenue_first,
pp.revenue_last,
pp.revenue_lifetime
# models/schema.yml
version: 2
models:
- name: growth_client_info
columns:
- name: client_id
tests:
- unique
- not_null
- name: client_name
- name: revenue_last
- name: revenue_lifetime
- name: revenue_lifetime_tier
- name: requests_last
- name: requests_lifetime
- name: days_as_client
- name: days_as_client_tier
- name: days_since_last_request
- name: is_active
- name: auth_submit_requests
- name: auth_get_requests
- name: auth_revenue_requests
- name: auth_distinct_occurrence_ids
- name: info_submit_requests
- name: info_get_requests
- name: info_revenue_requests
- name: balance_requests
- name: auth_delete_requests
- name: balance_accounts
- name: balance_distinct_oids
- name: connect_submit_requests
- name: connect_get_requests
- name: connect_delete_requests
- name: upgrade_requests
- name: connect_accounts
- name: connect_distinct_oids
Assumptions
- materialized='table' inferred from a LookML persist hint (persist_for / datagroup / sql_trigger_value).
- schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
growth_client_info.sql · 61 lines
source-preserved
validation: parses
SELECT
ap.client_id as client_id,
ap.client_name as client_name,
-- revenue history
pp.revenue_first as revenue_first,
pp.revenue_last as revenue_last,
pp.revenue_lifetime as revenue_lifetime,
-- request history
MIN(ap.current_time_ms) as requests_first,
MAX(ap.current_time_ms) as requests_last,
COUNT(*) as requests_lifetime,
-- pay-per-request, auth
COUNT(CASE WHEN ap.utilization_metric='auth-submit' THEN 1 END) as auth_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='auth-get' THEN 1 END) as auth_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='auth' THEN ap.occurrence_id END) as auth_distinct_oids,
-- pay-per-request, info
COUNT(CASE WHEN ap.utilization_metric='info-submit' THEN 1 END) as info_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='info-get' THEN 1 END) as info_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='info' THEN ap.occurrence_id END) as info_distinct_oids,
-- pay-per-account, balance
COUNT(CASE WHEN ap.utilization_metric='auth-delete' THEN 1 END) as auth_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='balance' THEN 1 END) as balance_requests,
COUNT(DISTINCT CASE WHEN ap.product_category IN ('auth','balance') THEN ap.occurrence_id END) as balance_distinct_oids,
-- pay-per-account, connect
COUNT(CASE WHEN ap.utilization_metric='connect-submit' THEN 1 END) as connect_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-delete' THEN 1 END) as connect_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-get' THEN 1 END) as connect_get_requests,
COUNT(CASE WHEN ap.utilization_metric='upgrade' THEN 1 END) as upgrade_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='connect' THEN ap.occurrence_id END) as connect_distinct_oids
FROM
api_production ap
LEFT OUTER JOIN (
SELECT
p.client_id as client_id,
MIN(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_first,
MAX(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_last,
SUM(p.amount) as revenue_lifetime
FROM
production_audit p
GROUP BY
p.client_id
) as pp
ON
pp.client_id=ap.client_id
WHERE
ap.client_name NOT IN ('test','financial_api_provider','carl')
GROUP BY
ap.client_id,
ap.client_name,
pp.revenue_first,
pp.revenue_last,
pp.revenue_lifetime
growth_client_info.view.lkml · 264 lines
inferred
view: growth_client_info {
derived_table: {
sql: SELECT
ap.client_id as client_id,
ap.client_name as client_name,
-- revenue history
pp.revenue_first as revenue_first,
pp.revenue_last as revenue_last,
pp.revenue_lifetime as revenue_lifetime,
-- request history
MIN(ap.current_time_ms) as requests_first,
MAX(ap.current_time_ms) as requests_last,
COUNT(*) as requests_lifetime,
-- pay-per-request, auth
COUNT(CASE WHEN ap.utilization_metric='auth-submit' THEN 1 END) as auth_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='auth-get' THEN 1 END) as auth_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='auth' THEN ap.occurrence_id END) as auth_distinct_oids,
-- pay-per-request, info
COUNT(CASE WHEN ap.utilization_metric='info-submit' THEN 1 END) as info_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='info-get' THEN 1 END) as info_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='info' THEN ap.occurrence_id END) as info_distinct_oids,
-- pay-per-account, balance
COUNT(CASE WHEN ap.utilization_metric='auth-delete' THEN 1 END) as auth_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='balance' THEN 1 END) as balance_requests,
COUNT(DISTINCT CASE WHEN ap.product_category IN ('auth','balance') THEN ap.occurrence_id END) as balance_distinct_oids,
-- pay-per-account, connect
COUNT(CASE WHEN ap.utilization_metric='connect-submit' THEN 1 END) as connect_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-delete' THEN 1 END) as connect_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-get' THEN 1 END) as connect_get_requests,
COUNT(CASE WHEN ap.utilization_metric='upgrade' THEN 1 END) as upgrade_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='connect' THEN ap.occurrence_id END) as connect_distinct_oids
FROM
api_production ap
LEFT OUTER JOIN (
SELECT
p.client_id as client_id,
MIN(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_first,
MAX(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_last,
SUM(p.amount) as revenue_lifetime
FROM
production_audit p
GROUP BY
p.client_id
) as pp
ON
pp.client_id=ap.client_id
WHERE
ap.client_name NOT IN ('test','financial_api_provider','carl')
GROUP BY
ap.client_id,
ap.client_name,
pp.revenue_first,
pp.revenue_last,
pp.revenue_lifetime ;;
persist_for: "12 hours"
}
dimension: client_id {
primary_key: yes
}
dimension: client_name {
sql: ${TABLE}.client_name ;;
}
dimension: revenue_last {
type: time
sql: ${TABLE}.revenue_last ;;
}
dimension: revenue_lifetime {
type: number
sql: ${TABLE}.revenue_lifetime ;;
}
dimension: revenue_lifetime_tier {
type: tier
sql: ${revenue_lifetime} ;;
}
dimension: requests_last {
type: time
sql: ${TABLE}.requests_last ;;
}
dimension: requests_lifetime {
type: number
sql: ${TABLE}.requests_lifetime ;;
}
dimension: days_as_client {
type: int
sql: DATEDIFF(days,${TABLE}.requests_first,${TABLE}.requests_last) + 1 ;;
}
dimension: days_as_client_tier {
type: tier
sql: ${days_as_client} ;;
}
dimension: days_since_last_request {
type: int
sql: DATEDIFF(days,${TABLE}.requests_last,CURRENT_DATE) ;;
}
dimension: is_active {
type: yesno
sql: ${days_since_last_request} < 7 ;;
}
dimension: auth_submit_requests {
type: number
hidden: yes
sql: ${TABLE}.auth_submit_requests ;;
}
dimension: auth_get_requests {
type: number
hidden: yes
sql: ${TABLE}.auth_get_requests ;;
}
dimension: auth_revenue_requests {
type: number
sql: ${TABLE}.auth_submit_requests + ${TABLE}.auth_get_requests ;;
}
dimension: auth_distinct_occurrence_ids {
type: number
sql: ${TABLE}.auth_distinct_oids ;;
}
dimension: info_submit_requests {
type: number
hidden: yes
sql: ${TABLE}.info_submit_requests ;;
}
dimension: info_get_requests {
type: number
hidden: yes
sql: ${TABLE}.info_get_requests ;;
}
dimension: info_revenue_requests {
type: number
sql: ${TABLE}.info_submit_requests + ${TABLE}.info_get_requests ;;
}
dimension: balance_requests {
type: number
hidden: yes
sql: ${TABLE}.balance_requests ;;
}
dimension: auth_delete_requests {
type: number
hidden: yes
sql: ${TABLE}.auth_delete_requests ;;
}
dimension: balance_accounts {
type: number
sql: ${TABLE}.auth_submit_requests - ${TABLE}.auth_delete_requests ;;
}
dimension: balance_distinct_oids {
type: number
sql: ${TABLE}.balance_distinct_oids ;;
}
dimension: connect_submit_requests {
type: number
hidden: yes
sql: ${TABLE}.connect_submit_requests ;;
}
dimension: connect_get_requests {
type: number
hidden: yes
sql: ${TABLE}.connect_get_requests ;;
}
dimension: connect_delete_requests {
type: number
hidden: yes
sql: ${TABLE}.connect_delete_requests ;;
}
dimension: upgrade_requests {
type: number
hidden: yes
sql: ${TABLE}.upgrade_requests ;;
}
dimension: connect_accounts {
type: number
sql: ${TABLE}.connect_submit_requests + ${TABLE}.upgrade_requests - ${TABLE}.connect_delete_requests ;;
}
dimension: connect_distinct_oids {
type: number
sql: ${TABLE}.connect_distinct_oids ;;
}
dimension_group: revenue_first {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.revenue_first ;;
}
dimension_group: requests_first {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.requests_first ;;
}
measure: clients_total {
type: count_distinct
drill_fields: [detail*]
sql: ${client_id} ;;
}
measure: clients_active {
type: count_distinct
filters: [growth_client_info.is_active: "True"]
sql: ${client_id} ;;
}
measure: retention_rate {
type: number
value_format: "#\%"
sql: 100.00 * ${clients_active} / NULLIF(${clients_total},0) ;;
}
measure: clients_auth {
type: count
filters: [auth_revenue_requests: ">0"]
}
measure: clients_info {
type: count
filters: [info_revenue_requests: ">0"]
}
measure: clients_balance {
type: count
filters: [balance_accounts: ">0"]
}
measure: clients_connect {
type: count
filters: [connect_accounts: ">0"]
}
}
growth_client_info.view.lookml · 201 lines
source-preserved
- view: growth_client_info
derived_table:
sql: SELECT
ap.client_id as client_id,
ap.client_name as client_name,
-- revenue history
pp.revenue_first as revenue_first,
pp.revenue_last as revenue_last,
pp.revenue_lifetime as revenue_lifetime,
-- request history
MIN(ap.current_time_ms) as requests_first,
MAX(ap.current_time_ms) as requests_last,
COUNT(*) as requests_lifetime,
-- pay-per-request, auth
COUNT(CASE WHEN ap.utilization_metric='auth-submit' THEN 1 END) as auth_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='auth-get' THEN 1 END) as auth_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='auth' THEN ap.occurrence_id END) as auth_distinct_oids,
-- pay-per-request, info
COUNT(CASE WHEN ap.utilization_metric='info-submit' THEN 1 END) as info_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='info-get' THEN 1 END) as info_get_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='info' THEN ap.occurrence_id END) as info_distinct_oids,
-- pay-per-account, balance
COUNT(CASE WHEN ap.utilization_metric='auth-delete' THEN 1 END) as auth_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='balance' THEN 1 END) as balance_requests,
COUNT(DISTINCT CASE WHEN ap.product_category IN ('auth','balance') THEN ap.occurrence_id END) as balance_distinct_oids,
-- pay-per-account, connect
COUNT(CASE WHEN ap.utilization_metric='connect-submit' THEN 1 END) as connect_submit_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-delete' THEN 1 END) as connect_delete_requests,
COUNT(CASE WHEN ap.utilization_metric='connect-get' THEN 1 END) as connect_get_requests,
COUNT(CASE WHEN ap.utilization_metric='upgrade' THEN 1 END) as upgrade_requests,
COUNT(DISTINCT CASE WHEN ap.product_category='connect' THEN ap.occurrence_id END) as connect_distinct_oids
FROM
api_production ap
LEFT OUTER JOIN (
SELECT
p.client_id as client_id,
MIN(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_first,
MAX(CASE WHEN p.amount > 0 THEN p.current_time_ms END) as revenue_last,
SUM(p.amount) as revenue_lifetime
FROM
production_audit p
GROUP BY
p.client_id
) as pp
ON
pp.client_id=ap.client_id
WHERE
ap.client_name NOT IN ('test','financial_api_provider','carl')
GROUP BY
ap.client_id,
ap.client_name,
pp.revenue_first,
pp.revenue_last,
pp.revenue_lifetime
persist_for: 12 hours
fields:
- dimension: client_id
primary_key: true
- dimension: client_name
sql: ${TABLE}.client_name
- dimension: revenue_last
type: time
sql: ${TABLE}.revenue_last
- dimension: revenue_lifetime
type: number
sql: ${TABLE}.revenue_lifetime
- dimension: revenue_lifetime_tier
type: tier
sql: ${revenue_lifetime}
- dimension: requests_last
type: time
sql: ${TABLE}.requests_last
- dimension: requests_lifetime
type: number
sql: ${TABLE}.requests_lifetime
- dimension: days_as_client
type: int
sql: DATEDIFF(days,${TABLE}.requests_first,${TABLE}.requests_last) + 1
- dimension: days_as_client_tier
type: tier
sql: ${days_as_client}
- dimension: days_since_last_request
type: int
sql: DATEDIFF(days,${TABLE}.requests_last,CURRENT_DATE)
- dimension: is_active
type: yesno
sql: ${days_since_last_request} < 7
- dimension: auth_submit_requests
type: number
hidden: true
sql: ${TABLE}.auth_submit_requests
- dimension: auth_get_requests
type: number
hidden: true
sql: ${TABLE}.auth_get_requests
- dimension: auth_revenue_requests
type: number
sql: ${TABLE}.auth_submit_requests + ${TABLE}.auth_get_requests
- dimension: auth_distinct_occurrence_ids
type: number
sql: ${TABLE}.auth_distinct_oids
- dimension: info_submit_requests
type: number
hidden: true
sql: ${TABLE}.info_submit_requests
- dimension: info_get_requests
type: number
hidden: true
sql: ${TABLE}.info_get_requests
- dimension: info_revenue_requests
type: number
sql: ${TABLE}.info_submit_requests + ${TABLE}.info_get_requests
- dimension: balance_requests
type: number
hidden: true
sql: ${TABLE}.balance_requests
- dimension: auth_delete_requests
type: number
hidden: true
sql: ${TABLE}.auth_delete_requests
- dimension: balance_accounts
type: number
sql: ${TABLE}.auth_submit_requests - ${TABLE}.auth_delete_requests
- dimension: balance_distinct_oids
type: number
sql: ${TABLE}.balance_distinct_oids
- dimension: connect_submit_requests
type: number
hidden: true
sql: ${TABLE}.connect_submit_requests
- dimension: connect_get_requests
type: number
hidden: true
sql: ${TABLE}.connect_get_requests
- dimension: connect_delete_requests
type: number
hidden: true
sql: ${TABLE}.connect_delete_requests
- dimension: upgrade_requests
type: number
hidden: true
sql: ${TABLE}.upgrade_requests
- dimension: connect_accounts
type: number
sql: ${TABLE}.connect_submit_requests + ${TABLE}.upgrade_requests - ${TABLE}.connect_delete_requests
- dimension: connect_distinct_oids
type: number
sql: ${TABLE}.connect_distinct_oids
- dimension_group: revenue_first
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.revenue_first
- dimension_group: requests_first
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.requests_first
- measure: clients_total
type: count_distinct
drill_fields:
- detail*
sql: ${client_id}
- measure: clients_active
type: count_distinct
filters:
- growth_client_info.is_active: True
sql: ${client_id}
- measure: retention_rate
type: number
value_format: '#\%'
sql: 100.00 * ${clients_active} / NULLIF(${clients_total},0)
- measure: clients_auth
type: count
filters:
- auth_revenue_requests: '>0'
- measure: clients_info
type: count
filters:
- info_revenue_requests: '>0'
- measure: clients_balance
type: count
filters:
- balance_accounts: '>0'
- measure: clients_connect
type: count
filters:
- connect_accounts: '>0'
Contents
- growth_client_info.sql
- growth_client_info.sql
- growth_client_info.view.lkml
- growth_client_info.view.lookml