SQL Ecommerce beauty

Trial Customer Facts

Trial Customer Facts model for ecommerce beauty.

source-preserved

Blocks

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

SELECT user.id AS user_id,
  min(DATE(user_history_facts.first_order_date)) AS first_order_date,
  min(datediff(curdate(), user_history_facts.first_order_date)) as days_since_purchase
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN order_consolidated AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN {{ ref('user_history_facts') }} AS user_history_facts ON `order`.user_id = user_history_facts.user_id

WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
  AND `order`.completed_at = user_history_facts.first_order_date AND
  `order`.completed_at is not null
  group by 1

# models/schema.yml
version: 2

models:
  - name: trial_customer_facts
    columns:
      - name: user_id
        tests:
          - unique
          - not_null
      - name: days_since_purchase

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.
trial_customer_facts.sql · 15 lines
source-preserved validation: not checked
SELECT user.id AS user_id,
  min(DATE(user_history_facts.first_order_date)) AS first_order_date,
  min(datediff(curdate(), user_history_facts.first_order_date)) as days_since_purchase
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN order_consolidated AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN ${user_history_facts.SQL_TABLE_NAME} AS user_history_facts ON `order`.user_id = user_history_facts.user_id

WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
  AND `order`.completed_at = user_history_facts.first_order_date AND
  `order`.completed_at is not null
  group by 1
trial_customer_facts.view.lkml · 42 lines
inferred
view: trial_customer_facts {
  derived_table: {
    sql: SELECT user.id AS user_id,
  min(DATE(user_history_facts.first_order_date)) AS first_order_date,
  min(datediff(curdate(), user_history_facts.first_order_date)) as days_since_purchase
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN order_consolidated AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN ${user_history_facts.SQL_TABLE_NAME} AS user_history_facts ON `order`.user_id = user_history_facts.user_id

WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
  AND `order`.completed_at = user_history_facts.first_order_date AND
  `order`.completed_at is not null
  group by 1 ;;
  }

  dimension: user_id {
    type: number
    primary_key: yes
    sql: ${TABLE}.user_id ;;
  }

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

  dimension_group: first_order {
    type: time
    timeframes: [date, year, month]
    sql: ${TABLE}.first_order_date ;;
  }

  measure: count {
    label: "Initial Purchase User Count"
    type: count
    drill_fields: [detail*]
  }
}
trial_customer_facts.view.lookml · 37 lines
source-preserved
- view: trial_customer_facts
  derived_table:
    sql: SELECT user.id AS user_id,
  min(DATE(user_history_facts.first_order_date)) AS first_order_date,
  min(datediff(curdate(), user_history_facts.first_order_date)) as days_since_purchase
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN order_consolidated AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN ${user_history_facts.SQL_TABLE_NAME} AS user_history_facts ON `order`.user_id = user_history_facts.user_id

WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
  AND `order`.completed_at = user_history_facts.first_order_date AND
  `order`.completed_at is not null
  group by 1
  fields:
  - dimension: user_id
    type: number
    primary_key: true
    sql: ${TABLE}.user_id
  - dimension: days_since_purchase
    type: number
    sql: ${TABLE}.days_since_purchase
  - dimension_group: first_order
    type: time
    timeframes:
    - date
    - year
    - month
    sql: ${TABLE}.first_order_date
  - measure: count
    type: count
    label: Initial Purchase User Count
    drill_fields:
    - detail*

Contents

  • trial_customer_facts.sql
  • trial_customer_facts.sql
  • trial_customer_facts.view.lkml
  • trial_customer_facts.view.lookml