dbt Ecommerce grooming

Derived Emails 24hr Revenue

Derived Emails 24hr Revenue model for ecommerce grooming.

inferred

Blocks

derived_emails_24hr_revenue.sql · 53 lines
inferred
-- models/derived_emails_24hr_revenue.sql
{{ config(materialized='view') }}

select
   g.id as group_id,
   concat(g.id, '-', g.name) as group_name,
   e.id as email_id,
   concat(e.id, '-', e.name) as email_name,
   v.id as variation_id,
   concat(v.id, '-', v.name) as variation_name,
 p.id as product_id, p.sku, p.name as product_name, sum(case when ck.id is not null then cse.quantity else 0 end) as quantity,
 sum(case when ck.id is not null then cse.quantity *pp.price else 0 end) as revenue
 from marketing_campaign_email_instances i
   join marketing_campaign_email_variation_events ve
     on i.campaign_email_variation_event_id = ve.id
   join marketing_campaign_email_variations v
     on ve.campaign_email_variation_id = v.id
   join marketing_campaign_emails e
     on v.campaign_email_id = e.id
   join marketing_campaign_email_groups g
     on e.campaign_email_group_id = g.id
   join marketing_campaign_email_clicks ck
     on ck.campaign_email_instance_id = i.id
 join customer_subscriptions cs
   on cs.customer_id = i.customer_id and cs.status in (1,2,4)
 left join customer_subscription_extras cse
   on cse.customer_subscription_id = cs.id and cse.created_at >= ck.created_at
 left join extras x
   on cse.extra_id = x.id
 left join products p
   on x.product_id = p.id
 left join product_prices pp
   on x.product_id = pp.product_id and pp.price > 0
   where i.created_at >= date(date_add(now(), interval -24 hour))
   group by 1, 2, 3, 4, 5, 6, 7, 8, 9

# models/schema.yml
version: 2

models:
  - name: derived_emails_24hr_revenue
    columns:
      - name: group_id
      - name: group_name
      - name: email_id
      - name: email_name
      - name: variation_id
      - name: variation_name
      - name: product_id
      - name: sku
      - name: product_name
      - name: quantity
      - name: revenue

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.
derived_emails_24hr_revenue.sql · 32 lines
source-preserved validation: parses
select
   g.id as group_id,
   concat(g.id, '-', g.name) as group_name,
   e.id as email_id,
   concat(e.id, '-', e.name) as email_name,
   v.id as variation_id,
   concat(v.id, '-', v.name) as variation_name,
 p.id as product_id, p.sku, p.name as product_name, sum(case when ck.id is not null then cse.quantity else 0 end) as quantity,
 sum(case when ck.id is not null then cse.quantity *pp.price else 0 end) as revenue
 from marketing_campaign_email_instances i
   join marketing_campaign_email_variation_events ve
     on i.campaign_email_variation_event_id = ve.id
   join marketing_campaign_email_variations v
     on ve.campaign_email_variation_id = v.id
   join marketing_campaign_emails e
     on v.campaign_email_id = e.id
   join marketing_campaign_email_groups g
     on e.campaign_email_group_id = g.id
   join marketing_campaign_email_clicks ck
     on ck.campaign_email_instance_id = i.id
 join customer_subscriptions cs
   on cs.customer_id = i.customer_id and cs.status in (1,2,4)
 left join customer_subscription_extras cse
   on cse.customer_subscription_id = cs.id and cse.created_at >= ck.created_at
 left join extras x
   on cse.extra_id = x.id
 left join products p
   on x.product_id = p.id
 left join product_prices pp
   on x.product_id = pp.product_id and pp.price > 0
   where i.created_at >= date(date_add(now(), interval -24 hour))
   group by 1, 2, 3, 4, 5, 6, 7, 8, 9
derived_emails_24hr_revenue.view.lkml · 89 lines
inferred
view: derived_emails_24hr_revenue {
  derived_table: {
    sql: select
   g.id as group_id,
   concat(g.id, '-', g.name) as group_name,
   e.id as email_id,
   concat(e.id, '-', e.name) as email_name,
   v.id as variation_id,
   concat(v.id, '-', v.name) as variation_name,
 p.id as product_id, p.sku, p.name as product_name, sum(case when ck.id is not null then cse.quantity else 0 end) as quantity,
 sum(case when ck.id is not null then cse.quantity *pp.price else 0 end) as revenue
 from marketing_campaign_email_instances i
   join marketing_campaign_email_variation_events ve
     on i.campaign_email_variation_event_id = ve.id
   join marketing_campaign_email_variations v
     on ve.campaign_email_variation_id = v.id
   join marketing_campaign_emails e
     on v.campaign_email_id = e.id
   join marketing_campaign_email_groups g
     on e.campaign_email_group_id = g.id
   join marketing_campaign_email_clicks ck
     on ck.campaign_email_instance_id = i.id
 join customer_subscriptions cs
   on cs.customer_id = i.customer_id and cs.status in (1,2,4)
 left join customer_subscription_extras cse
   on cse.customer_subscription_id = cs.id and cse.created_at >= ck.created_at
 left join extras x
   on cse.extra_id = x.id
 left join products p
   on x.product_id = p.id
 left join product_prices pp
   on x.product_id = pp.product_id and pp.price > 0
   where i.created_at >= date(date_add(now(), interval -24 hour))
   group by 1, 2, 3, 4, 5, 6, 7, 8, 9 ;;
  }

  dimension: group_id {
    type: number
    sql: ${TABLE}.group_id ;;
  }

  dimension: group_name {
    sql: ${TABLE}.group_name ;;
  }

  dimension: email_id {
    type: number
    sql: ${TABLE}.email_id ;;
  }

  dimension: email_name {
    sql: ${TABLE}.email_name ;;
  }

  dimension: variation_id {
    type: number
    sql: ${TABLE}.variation_id ;;
  }

  dimension: variation_name {
    sql: ${TABLE}.variation_name ;;
  }

  dimension: product_id {
    sql: ${TABLE}.product_id ;;
  }

  dimension: sku {
    sql: ${TABLE}.sku ;;
  }

  dimension: product_name {
    sql: ${TABLE}.product_name ;;
  }

  dimension: quantity {
    type: int
    sql: ${TABLE}.quantity ;;
  }

  dimension: revenue {
    sql: ${TABLE}.revenue ;;
  }

  measure: count {
    type: count
    drill_fields: [detail*]
  }
}
derived_emails_24hr_revenue.view.lookml · 65 lines
source-preserved
- view: derived_emails_24hr_revenue
  derived_table:
    sql: select
   g.id as group_id,
   concat(g.id, '-', g.name) as group_name,
   e.id as email_id,
   concat(e.id, '-', e.name) as email_name,
   v.id as variation_id,
   concat(v.id, '-', v.name) as variation_name,
 p.id as product_id, p.sku, p.name as product_name, sum(case when ck.id is not null then cse.quantity else 0 end) as quantity,
 sum(case when ck.id is not null then cse.quantity *pp.price else 0 end) as revenue
 from marketing_campaign_email_instances i
   join marketing_campaign_email_variation_events ve
     on i.campaign_email_variation_event_id = ve.id
   join marketing_campaign_email_variations v
     on ve.campaign_email_variation_id = v.id
   join marketing_campaign_emails e
     on v.campaign_email_id = e.id
   join marketing_campaign_email_groups g
     on e.campaign_email_group_id = g.id
   join marketing_campaign_email_clicks ck
     on ck.campaign_email_instance_id = i.id
 join customer_subscriptions cs
   on cs.customer_id = i.customer_id and cs.status in (1,2,4)
 left join customer_subscription_extras cse
   on cse.customer_subscription_id = cs.id and cse.created_at >= ck.created_at
 left join extras x
   on cse.extra_id = x.id
 left join products p
   on x.product_id = p.id
 left join product_prices pp
   on x.product_id = pp.product_id and pp.price > 0
   where i.created_at >= date(date_add(now(), interval -24 hour))
   group by 1, 2, 3, 4, 5, 6, 7, 8, 9
  fields:
  - dimension: group_id
    type: number
    sql: ${TABLE}.group_id
  - dimension: group_name
    sql: ${TABLE}.group_name
  - dimension: email_id
    type: number
    sql: ${TABLE}.email_id
  - dimension: email_name
    sql: ${TABLE}.email_name
  - dimension: variation_id
    type: number
    sql: ${TABLE}.variation_id
  - dimension: variation_name
    sql: ${TABLE}.variation_name
  - dimension: product_id
    sql: ${TABLE}.product_id
  - dimension: sku
    sql: ${TABLE}.sku
  - dimension: product_name
    sql: ${TABLE}.product_name
  - dimension: quantity
    type: int
    sql: ${TABLE}.quantity
  - dimension: revenue
    sql: ${TABLE}.revenue
  - measure: count
    type: count
    drill_fields:
    - detail*

Contents

  • derived_emails_24hr_revenue.sql
  • derived_emails_24hr_revenue.sql
  • derived_emails_24hr_revenue.view.lkml
  • derived_emails_24hr_revenue.view.lookml