SQL Example: Lifetime Value by Day Range (60, 90, 180, 365)
Overview
This query calculates the Average Customer Lifetime Value (LTV) across multiple time horizons (60, 90, 180, and 365 days), based on each customer's first order during a defined acquisition cohort.
SQL Query
WITH src_tbl AS
(
SELECT
customer_id,
groupArray( (event_date, order_revenue) ) AS orders,
any(if(is_new_customer AND event_date BETWEEN '2024-01-01' AND '2024-03-31', event_date, null)) AS first_order_date
FROM
orders_table o
WHERE
event_date BETWEEN '2024-01-01' AND '2025-03-31'
GROUP BY
customer_id
HAVING
first_order_date IS NOT NULL
)
SELECT
avg(arraySum(arrayMap((d, r) -> if(dateDiff('day', first_order_date, d) <= 60, r, 0), orders))) AS avg_ltv_60,
avg(arraySum(arrayMap((d, r) -> if(dateDiff('day', first_order_date, d) <= 90, r, 0), orders))) AS avg_ltv_90,
avg(arraySum(arrayMap((d, r) -> if(dateDiff('day', first_order_date, d) <= 180, r, 0), orders))) AS avg_ltv_180,
avg(arraySum(arrayMap((d, r) -> if(dateDiff('day', first_order_date, d) <= 365, r, 0), orders))) AS avg_ltv_365
FROM
src_tblTables and Metrics Used
Table
orders_table(Orders Table)
Dimensions
event_datecustomer_idis_new_customer
Measures
order_revenue
Customization Options
This query uses a fixed cohort acquisition window (2024-01-01 to 2024-03-31) and evaluates LTV over four rolling periods from each customer's first order date. You can customize it in the following ways:
Change cohort window
- Adjust the
event_daterange in theany()condition to define a different acquisition cohort.
Extend LTV windows
- Add or change
arrayMapconditions to include new durations (e.g. 730 for 2-year LTV).
Filter by platform or channel
- Add
AND platform = 'Shopify'or similar filters inside theWHEREclause if needed.
Updated 3 months ago