Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions greenery/dbt_project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,5 @@ models:
# Config indicated by + and applies to all files under models/example/
staging:
+materialized: view
marts:
+materialized: table
10 changes: 10 additions & 0 deletions greenery/models/marts/core/dim_products.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
SELECT
products.product_id
, products.name as product_name
, products.price
, CASE WHEN products.inventory = 0 THEN false ELSE true END AS is_in_stock
, products.inventory as number_in_stock
, COUNT(DISTINCT order_items.order_id) as number_of_orders_with_product
FROM {{ ref('stg_products__products') }} AS products
LEFT JOIN {{ ref('stg_order_items__order_items')}} AS order_items ON products.product_id = order_items.product_id
GROUP BY 1, 2, 3, 4, 5
10 changes: 10 additions & 0 deletions greenery/models/marts/core/dim_users.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
SELECT
products.product_id
, products.name as product_name
, products.price
, CASE WHEN products.inventory = 0 THEN false ELSE true END AS is_in_stock
, products.inventory as number_in_stock
, COUNT(DISTINCT order_items.order_id) as number_of_orders_with_product
FROM {{ ref('stg_products__products') }} AS products
LEFT JOIN {{ ref('stg_order_items__order_items')}} AS order_items ON products.product_id = order_items.product_id
GROUP BY 1, 2, 3, 4, 5
18 changes: 18 additions & 0 deletions greenery/models/marts/core/fct_shipping.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
SELECT
shipping.order_id
, shipping.address_id
, shipping.address
, shipping.zipcode
, shipping.state
, shipping.country
, shipping.is_usa
, shipping.shipping_cost
, shipping.tracking_id
, shipping.shipping_service
, shipping.status
, CASE WHEN date_trunc('day', shipping.estimated_delivery_at_utc) > date_trunc('day', shipping.delivered_at_utc) THEN 'Early'
WHEN date_trunc('day', shipping.estimated_delivery_at_utc) < date_trunc('day', shipping.delivered_at_utc) THEN 'Late'
WHEN date_trunc('day', shipping.estimated_delivery_at_utc) = date_trunc('day', shipping.delivered_at_utc) THEN 'On Time'
ELSE NULL END as delivery_timeliness
, delivered_at_utc::date - created_at_utc::date AS days_from_order_to_delivery
FROM {{ ref('int_shipping') }} AS shipping
18 changes: 18 additions & 0 deletions greenery/models/marts/core/intermediate/int_orders.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
SELECT
orders.order_id
, orders.user_id
, orders.address_id as order_address_id
, orders.created_at_utc as order_created_at_utc
, CASE WHEN orders.promo_id IS NOT NULL THEN true ELSE false END AS has_promo_code
, promos.promo_id
, promos.discount AS promo_discount
, orders.order_cost
, orders.shipping_cost
, orders.order_total as order_total_cost
, orders.status as order_status
, orders.tracking_id
, orders.shipping_service
, orders.estimated_delivery_at_utc
, orders.delivered_at_utc
FROM {{ ref('stg_orders__orders') }} AS orders
LEFT JOIN {{ ref('stg_promos__promos') }} AS promos ON orders.promo_id = promos.promo_id
19 changes: 19 additions & 0 deletions greenery/models/marts/core/intermediate/int_shipping.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
SELECT
orders.order_id
, addresses.address_id
, addresses.address
/* check for for zip code length */
, CASE WHEN LENGTH(addresses.zipcode::text) = 4 THEN CONCAT(0, addresses.zipcode) ELSE zipcode::text END AS zipcode
, addresses.state
, addresses.country
/* Add flag to determin local orders vs int orders */
, CASE WHEN addresses.country = 'United States' THEN true ELSE false END AS is_usa
, orders.created_at_utc
, orders.shipping_cost
, orders.tracking_id
, orders.shipping_service
, orders.status
, orders.estimated_delivery_at_utc
, orders.delivered_at_utc
FROM {{ ref('stg_addresses__addresses') }} AS addresses
JOIN {{ ref('stg_orders__orders') }} AS orders ON addresses.address_id = orders.address_id
17 changes: 17 additions & 0 deletions greenery/models/marts/core/intermediate/int_users.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
WITH customer_order_count AS
(SELECT orders.user_id, COUNT(DISTINCT order_id) as number_of_user_orders
FROM {{ ref('stg_orders__orders' ) }} as orders
GROUP BY orders.user_id
)

SELECT
users.user_id
, CASE WHEN customer_order_count.number_of_user_orders > 1 THEN true ELSE false END AS is_repeat_customer
, CASE WHEN customer_order_count.number_of_user_orders IS NULL THEN 0 ELSE customer_order_count.number_of_user_orders END AS number_of_user_orders
, users.first_name
, users.last_name
, users.email
, users.phone_number
, users.created_at_utc as user_created_at_utc
FROM {{ ref('stg_users__users') }} AS users
LEFT JOIN customer_order_count ON users.user_id = customer_order_count.user_id
20 changes: 20 additions & 0 deletions greenery/models/marts/core/intermediate/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: 2

models:
- name: int_order_shipping
description: shipping info related to order
columns:
- name: address_id
description: UUID for each unique address on platform
tests:
- not_null
- name: zipcode
- name: is_usa

- name: int_users
description: User information
columns:
- name: user_id

- name: int_orders
description: promo code with order info
26 changes: 26 additions & 0 deletions greenery/models/marts/core/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
version: 2

models:
- name: dim_products
description: this dim incclude number of orders containing a product.
columns:
- name: product_id
tests:
- not_null
- unique

- name: fct_shipping
description: this fact table inclue shipping information related ot order, that includes address, carrier and delivery time.
columns:
- name: order_id
tests:
- not_null
- unique

- name: dim_users
description: this dim will have information related to first order date and most recent order detail.
columns:
- name: user_id
tests:
- not_null
- unique
26 changes: 26 additions & 0 deletions greenery/models/marts/marketing/fct_user_orders.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
SELECT
orders.order_id
, orders.user_id
, users.is_repeat_customer
, users.number_of_user_orders
, users.first_name
, users.last_name
, users.email
, users.phone_number
, users.user_created_at_utc
, orders.order_address_id
, orders.order_created_at_utc
, CASE WHEN orders.promo_id IS NOT NULL THEN true ELSE false END AS has_promo_code
, promos.promo_id
, promos.discount AS promo_discount
, orders.order_cost
, orders.shipping_cost
, orders.order_total_cost
, orders.order_status
, orders.tracking_id
, orders.shipping_service
, orders.estimated_delivery_at_utc
, orders.delivered_at_utc
FROM {{ ref('int_orders') }} AS orders
JOIN {{ ref('int_users' )}} AS users ON users.user_id = orders.user_id
LEFT JOIN {{ ref('stg_promos__promos')}} AS promos ON orders.promo_id = promos.promo_id
10 changes: 10 additions & 0 deletions greenery/models/marts/marketing/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2

models:
- name: fct_user_orders
description: user order information and promo information
columns:
- name: user_id
tests:
- not_null

6 changes: 6 additions & 0 deletions greenery/models/marts/product/fct_page_views.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
SELECT events_agg.session_id
, events_agg.user_id
, events_agg.page_view
, events_agg.created_at_utc
, events_agg.page_url
FROM {{ ref('int_session_events_agg') }} AS events_agg
26 changes: 26 additions & 0 deletions greenery/models/marts/product/fct_sessions.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
WITH session_length AS (
SELECT session_id
, MAX(created_at_utc) AS first_event
, MIN(created_at_utc) AS last_event
FROM {{ ref('int_session_events_agg') }} AS events
GROUP BY session_id
)

SELECT events_agg.session_id
, events_agg.user_id
, users.first_name
, users.last_name
, users.email
, events_agg.page_view
, events_agg.add_to_cart
, events_agg.checkout
, events_agg.package_shipped
, session_length.first_event
, session_length.last_event
, (DATE_PART('DAY', session_length.last_event::timestamp - session_length.first_event::timestamp) * 24 +
DATE_PART('HOUR', session_length.last_event::timestamp - session_length.first_event::timestamp)) * 60 +
DATE_PART('MINUTE', session_length.last_event::timestamp - session_length.first_event::timestamp)
AS session_length_minutes
FROM {{ ref('int_session_events_agg') }} AS events_agg
LEFT JOIN {{ ref('stg_users__users') }} AS users ON events_agg.user_id = users.user_id
LEFT JOIN session_length ON events_agg.session_id = session_length.session_id
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
SELECT
events.session_id
, events.created_at_utc
, events.user_id
, events.page_url
, SUM(CASE WHEN event_type = 'package shipped' THEN 1 ELSE 0 END) AS package_shipped
, SUM(CASE WHEN event_type = 'page_view' THEN 1 ELSE 0 END) AS page_view
, SUM(CASE WHEN event_type = 'checkout' THEN 1 ELSE 0 END) AS checkout
, SUM(CASE WHEN event_type = 'add_to_cart' THEN 1 ELSE 0 END) AS add_to_cart
FROM {{ ref('stg_events__events') }} AS events
GROUP BY 1, 2, 3, 4
5 changes: 5 additions & 0 deletions greenery/models/marts/product/intermediate/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
version: 2

models:
- name: int_session_events_agg
description: Aggregated session events by user
7 changes: 7 additions & 0 deletions greenery/models/marts/product/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: 2

models:
- name: fct_sessions
description: events for related session and User information
- name: fct_page_views
description: Page view events
7 changes: 2 additions & 5 deletions greenery/models/staging/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ models:
- name: address_id
- name: created_at
- name: order_cost
- name: shipping_cost
- name: order_total
- name: tracking_id
- name: shipping_service
Expand All @@ -24,8 +25,6 @@ models:
columns:
- name: addresses_id
description: Unique identifier for an address.
tests:
- unique
- name: address
- name: zipcode
- name: state
Expand All @@ -40,7 +39,7 @@ models:
- name: session_id
- name: user_id
- name: page_url
- name: created_at
- name: created_at_utc
- name: event_type
- name: order_id
- name: product_id
Expand All @@ -49,8 +48,6 @@ models:
columns:
- name: order_id
description: Unique identifier for an event.
tests:
- unique
- name: product_id
- name: qunantity
- name: stg_products__products
Expand Down
2 changes: 1 addition & 1 deletion greenery/models/staging/stg_events__events.sql
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ final as (
from events
)

select * from events
select * from final
1 change: 1 addition & 0 deletions greenery/models/staging/stg_orders__orders.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ with orders as (
address_id,
created_at as created_at_utc,
order_cost,
shipping_cost,
order_total,
tracking_id,
shipping_service,
Expand Down
7 changes: 7 additions & 0 deletions greenery/tests/zip_code_length.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
select address_id
, zipcode
, length(zipcode::text)
, state
from "dbt"."dbt_kiran_g"."stg_addresses__addresses"
group by address_id, zipcode, state
having length(zipcode::text) NOT IN (4,5)