Skip to content
Open
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
24 changes: 24 additions & 0 deletions dbt/analytics/dbt_project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: 'analytics'

config-version: 2
version: '0.1'

profile: 'jaffle_shop'

model-paths: ["models"]
seed-paths: ["seeds"]
test-paths: ["tests"]
analysis-paths: ["analysis"]
macro-paths: ["macros"]

target-path: "target"
clean-targets:
- "target"
- "dbt_modules"
- "logs"

require-dbt-version: [">=1.0.0", "<2.0.0"]

models:
analytics:
materialized: table
42 changes: 42 additions & 0 deletions dbt/analytics/models/customer_lifetime_value.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
-- Customer Lifetime Value (CLV) analysis
-- Segments customers by purchase behavior and calculates lifetime value

{{ config(materialized='table') }}

with customer_orders as (
select
customer_id,
min(order_date) as first_order_date,
max(order_date) as last_order_date,
count(*) as total_orders,
sum(amount) as total_spent
from {{ source('jaffle_shop', 'orders') }}
group by 1
),

customer_metrics as (
select
customer_id,
first_order_date,
last_order_date,
total_orders,
total_spent,
total_spent / nullif(total_orders, 0) as avg_order_value,
datediff('day', first_order_date, last_order_date) as customer_lifespan_days
from customer_orders
)

select
customer_id,
first_order_date,
last_order_date,
total_orders,
total_spent as lifetime_value,
avg_order_value,
customer_lifespan_days,
case
when total_spent >= 100 then 'high_value'
when total_spent >= 50 then 'medium_value'
else 'low_value'
end as customer_segment
from customer_metrics
21 changes: 21 additions & 0 deletions dbt/analytics/models/monthly_revenue.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
-- Monthly revenue summary for analytics
-- This is a test model for monorepo setup

{{ config(materialized='table') }}

with orders as (
select
date_trunc('month', order_date) as month,
sum(amount) as total_revenue,
count(*) as order_count
from {{ source('jaffle_shop', 'orders') }}
group by 1
)

select
month,
total_revenue,
order_count,
total_revenue / nullif(order_count, 0) as avg_order_value
from orders
order by month desc
37 changes: 37 additions & 0 deletions dbt/analytics/models/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
version: 2

models:
- name: monthly_revenue
description: Monthly revenue aggregation for trend analysis
columns:
- name: month
description: First day of the month
- name: total_revenue
description: Sum of all order amounts in the month
- name: order_count
description: Number of orders in the month
- name: avg_order_value
description: Average order value for the month

- name: customer_lifetime_value
description: Customer lifetime value analysis with segmentation
columns:
- name: customer_id
description: Unique customer identifier
- name: first_order_date
description: Date of customer's first order
- name: last_order_date
description: Date of customer's most recent order
- name: total_orders
description: Total number of orders placed by customer
- name: lifetime_value
description: Total amount spent by customer
- name: avg_order_value
description: Average amount per order
- name: customer_lifespan_days
description: Days between first and last order
- name: customer_segment
description: Value segment (high_value, medium_value, low_value)
tests:
- accepted_values:
values: ['high_value', 'medium_value', 'low_value']
8 changes: 8 additions & 0 deletions dbt/analytics/models/sources.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: 2

sources:
- name: jaffle_shop
schema: dev
tables:
- name: orders
- name: customers
7 changes: 7 additions & 0 deletions dbt/analytics/profiles.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
jaffle_shop:
target: dev
outputs:
dev:
type: duckdb
path: jaffle_shop.duckdb
threads: 24
Loading
Loading