-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathProduct_Analysis_Metrics.sql
More file actions
180 lines (154 loc) · 3.26 KB
/
Product_Analysis_Metrics.sql
File metadata and controls
180 lines (154 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
-- Daily Active Users (DAU)
SELECT
activity_date,
COUNT(DISTINCT user_id) AS dau
FROM
user_activity_log
GROUP BY
activity_date
ORDER BY
activity_date;
-- Weekly Active Users (WAU)
SELECT
DATE_TRUNC('week', activity_timestamp) AS week_start,
COUNT(DISTINCT user_id) AS wau
FROM
user_activity_log
GROUP BY
week_start
ORDER BY
week_start;
-- Monthly Active Users (MAU)
SELECT
DATE_TRUNC('month', activity_timestamp) AS month_start,
COUNT(DISTINCT user_id) AS mau
FROM
user_activity_log
GROUP BY
month_start
ORDER BY
month_start;
-- User Retention
WITH first_week AS (
SELECT
user_id,
MIN(DATE(activity_timestamp)) AS first_week
FROM
user_activity_log
GROUP BY
user_id
),
retention AS (
SELECT
f.first_week,
DATE_TRUNC('week', u.activity_timestamp) AS activity_week,
COUNT(DISTINCT u.user_id) AS retained_users
FROM
first_week f
LEFT JOIN
user_activity_log u
ON
f.user_id = u.user_id
AND DATE_TRUNC('week', u.activity_timestamp) > f.first_week
GROUP BY
f.first_week, activity_week
)
SELECT
first_week,
activity_week,
retained_users,
ROUND((retained_users::DECIMAL / COUNT(DISTINCT user_id) OVER (PARTITION BY first_week))*100, 2) AS retention_rate
FROM
retention
ORDER BY
first_week, activity_week;
-- User Churn Rate
WITH user_activity AS (
SELECT
user_id,
MAX(DATE(activity_timestamp)) AS last_active_date
FROM
user_activity_log
GROUP BY
user_id
),
churned_users AS (
SELECT
user_id
FROM
user_activity
WHERE
last_active_date < CURRENT_DATE - INTERVAL '30 days'
)
SELECT
COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users) * 100 AS churn_rate
FROM
churned_users;
-- User Engagement
SELECT
DATE(activity_timestamp) AS activity_date,
COUNT(*) AS total_engagements,
AVG(engagement_count) AS avg_engagements_per_user
FROM (
SELECT
user_id,
DATE(activity_timestamp) AS activity_date,
COUNT(*) AS engagement_count
FROM
user_activity_log
GROUP BY
user_id, activity_date
) sub
GROUP BY
activity_date
ORDER BY
activity_date;
-- Conversion Rate
SELECT
COUNT(*)::DECIMAL / (SELECT COUNT(*) FROM users) * 100 AS conversion_rate
FROM
user_premium_subscriptions
WHERE
subscription_start_date >= CURRENT_DATE - INTERVAL '30 days';
-- Revenue Metrics
SELECT
DATE(payment_date) AS payment_date,
SUM(amount) AS daily_revenue
FROM
user_payments
GROUP BY
payment_date
ORDER BY
payment_date
-- Customer Acquisition Cost (CAC)
SELECT
SUM(marketing_expense) / COUNT(DISTINCT user_id) AS cac
FROM
marketing_expenses, users
WHERE
signup_date >= marketing_start_date
AND signup_date <= marketing_end_date;
-- Lifetime Value (LTV)
with total_revenue as (
select
user_id, sum(amount) sm
from
user_payments
group by user_id
),
life_span as (
select
user_id, MAX(payment_date) - MIN(payment_date) AS lifetime_days
from
user_payments
group by user_id
)
select
round(avg(sm), 2) avg_lifetime_value,
round(avg(lifetime_days), 2) avg_user_lifetime
from
total_revenue a
join
life_span b
on
a.user_id=b.user_id