SQL
Ecommerce beauty
User Historical Purchase Facts
User Historical Purchase Facts model for ecommerce beauty.
source-preserved
Blocks
user_historical_purchase_facts.sql · 47 lines
inferred
-- models/user_historical_purchase_facts.sql
{{ config(materialized='view') }}
SELECT user.id as user_id
, min(order.completed_at) as min_date
, max(order.completed_at) as max_date
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN category AS variant_category ON variant.category_key = variant_category.category_key
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN (SELECT
*
, (
SELECT COUNT(*)
FROM order_consolidated o
WHERE o.id <= `order`.id
AND o.user_id = `order`.user_id
and o.completed_at IS NOT NULL
)
AS user_order_sequence_number
FROM order_consolidated AS `order`) AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN promotion_info_coupon_order as spco ON `order`.id = spco.order_id
LEFT JOIN promotion_info_coupon spc ON spco.promotion_coupon_id = spc.id
WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
AND {% condition category_name %} variant_category.name {% endcondition %}
AND {% condition unit_price %} order_item.unit_price/100.0 {% endcondition %}
AND {% condition date_filter %} order.completed_at {% endcondition %}
AND {% condition order_total %} order.total/100.0 {% endcondition %}
AND {% condition order_sequence_number %} order.user_order_sequence_number {% endcondition %}
AND (CAST(CONVERT_TZ(`order`.completed_at,'UTC','America/Los_Angeles') AS CHAR)) is not null
AND order.deleted_at is null
AND (spc.code IS NULL OR spc.code <> <% parameter promo_code2 %>)
AND user_id is not null
Group by 1
# models/schema.yml
version: 2
models:
- name: user_historical_purchase_facts
columns:
- name: user_id
tests:
- unique
- not_null
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.
user_historical_purchase_facts.sql · 33 lines
source-preserved
validation: not checked
SELECT user.id as user_id
, min(order.completed_at) as min_date
, max(order.completed_at) as max_date
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN category AS variant_category ON variant.category_key = variant_category.category_key
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN (SELECT
*
, (
SELECT COUNT(*)
FROM order_consolidated o
WHERE o.id <= `order`.id
AND o.user_id = `order`.user_id
and o.completed_at IS NOT NULL
)
AS user_order_sequence_number
FROM order_consolidated AS `order`) AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN promotion_info_coupon_order as spco ON `order`.id = spco.order_id
LEFT JOIN promotion_info_coupon spc ON spco.promotion_coupon_id = spc.id
WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
AND {% condition category_name %} variant_category.name {% endcondition %}
AND {% condition unit_price %} order_item.unit_price/100.0 {% endcondition %}
AND {% condition date_filter %} order.completed_at {% endcondition %}
AND {% condition order_total %} order.total/100.0 {% endcondition %}
AND {% condition order_sequence_number %} order.user_order_sequence_number {% endcondition %}
AND (CAST(CONVERT_TZ(`order`.completed_at,'UTC','America/Los_Angeles') AS CHAR)) is not null
AND order.deleted_at is null
AND (spc.code IS NULL OR spc.code <> <% parameter promo_code2 %>)
AND user_id is not null
Group by 1
user_historical_purchase_facts.view.lkml · 63 lines
inferred
view: user_historical_purchase_facts {
derived_table: {
sql: SELECT user.id as user_id
, min(order.completed_at) as min_date
, max(order.completed_at) as max_date
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN category AS variant_category ON variant.category_key = variant_category.category_key
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN (SELECT
*
, (
SELECT COUNT(*)
FROM order_consolidated o
WHERE o.id <= `order`.id
AND o.user_id = `order`.user_id
and o.completed_at IS NOT NULL
)
AS user_order_sequence_number
FROM order_consolidated AS `order`) AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN promotion_info_coupon_order as spco ON `order`.id = spco.order_id
LEFT JOIN promotion_info_coupon spc ON spco.promotion_coupon_id = spc.id
WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
AND {% condition category_name %} variant_category.name {% endcondition %}
AND {% condition unit_price %} order_item.unit_price/100.0 {% endcondition %}
AND {% condition date_filter %} order.completed_at {% endcondition %}
AND {% condition order_total %} order.total/100.0 {% endcondition %}
AND {% condition order_sequence_number %} order.user_order_sequence_number {% endcondition %}
AND (CAST(CONVERT_TZ(`order`.completed_at,'UTC','America/Los_Angeles') AS CHAR)) is not null
AND order.deleted_at is null
AND (spc.code IS NULL OR spc.code <> <% parameter promo_code2 %>)
AND user_id is not null
Group by 1 ;;
}
dimension: user_id {
type: number
primary_key: yes
hidden: yes
sql: ${TABLE}.user_id ;;
}
dimension_group: first_filtered_purchase {
description: "First purchase date matching any user_historical_purchase_facts filters applied. Use User.first_purchase for customer's first purchase"
type: time
timeframes: [time, date, week, month, year]
sql: ${TABLE}.min_date ;;
}
dimension_group: last_filtered_purchase {
description: "Last purchase date matching any user_historical_purchase_facts filters applied. Use User.last_purchase for customer's last purchase"
type: time
timeframes: [time, date, week, month, year]
sql: ${TABLE}.max_date ;;
}
measure: count_first_purchase_users {
type: count_distinct
sql: ${user_id} ;;
}
}
user_historical_purchase_facts.view.lookml · 62 lines
source-preserved
- view: user_historical_purchase_facts
derived_table:
sql: SELECT user.id as user_id
, min(order.completed_at) as min_date
, max(order.completed_at) as max_date
FROM order_item_consolidated AS order_item
LEFT JOIN variant_consolidated AS variant ON order_item.variant_id = variant.id
LEFT JOIN category AS variant_category ON variant.category_key = variant_category.category_key
LEFT JOIN product_consolidated AS product ON variant.product_id = product.id
LEFT JOIN (SELECT
*
, (
SELECT COUNT(*)
FROM order_consolidated o
WHERE o.id <= `order`.id
AND o.user_id = `order`.user_id
and o.completed_at IS NOT NULL
)
AS user_order_sequence_number
FROM order_consolidated AS `order`) AS `order` ON order_item.order_id = `order`.id
LEFT JOIN sylius_user_consolidated AS user ON `order`.user_id = user.id
LEFT JOIN promotion_info_coupon_order as spco ON `order`.id = spco.order_id
LEFT JOIN promotion_info_coupon spc ON spco.promotion_coupon_id = spc.id
WHERE 1=1
AND {% condition product_name %} product_name {% endcondition %}
AND {% condition category_name %} variant_category.name {% endcondition %}
AND {% condition unit_price %} order_item.unit_price/100.0 {% endcondition %}
AND {% condition date_filter %} order.completed_at {% endcondition %}
AND {% condition order_total %} order.total/100.0 {% endcondition %}
AND {% condition order_sequence_number %} order.user_order_sequence_number {% endcondition %}
AND (CAST(CONVERT_TZ(`order`.completed_at,'UTC','America/Los_Angeles') AS CHAR)) is not null
AND order.deleted_at is null
AND (spc.code IS NULL OR spc.code <> <% parameter promo_code2 %>)
AND user_id is not null
Group by 1
fields:
- dimension: user_id
type: number
primary_key: true
hidden: true
sql: ${TABLE}.user_id
- dimension_group: first_filtered_purchase
type: time
timeframes:
- time
- date
- week
- month
- year
sql: ${TABLE}.min_date
- dimension_group: last_filtered_purchase
type: time
timeframes:
- time
- date
- week
- month
- year
sql: ${TABLE}.max_date
- measure: count_first_purchase_users
type: count_distinct
sql: ${user_id}
Contents
- user_historical_purchase_facts.sql
- user_historical_purchase_facts.sql
- user_historical_purchase_facts.view.lkml
- user_historical_purchase_facts.view.lookml