I want to answer the following question using the below Mysql tables.
How many days were the user active on avg. (had an action) in the last week?
I want to Display user Avg by day, where ((user action is not 0)/unique day) in the last 7 days.
0 means the user is not active and 1 means active.
I am still a newbie in SQL and here is what I have tried so far. I am not really sure of my answers.
SELECT u.username, COUNT(u.snapshot_date) as 'active_days', a.action FROM actions a JOIN users u ON a.user_id = u.user_id WHERE NOT (a.action = 0) GROUP BY u.username;
my output
username active_days action Albert 2 1 Paul 4 1 Ronaldo 2 1 Messi 1 1
users table
user_id username snapshot_date 1 Albert 2022-01-10 2 Paul 2022-01-10 3 Blessing 2022-01-10 4 Ronaldo 2022-01-22 5 Messi 2022-01-01
action table
action_id action snapshot_date user_id 1 0 2022-01-10 1 2 1 2022-01-10 2 3 0 2022-01-10 3 4 1 2022-01-22 4 5 1 2022-01-01 5 6 0 2022-01-10 2 7 0 2022-01-10 1 8 0 2022-01-10 3 9 0 2022-01-22 2 10 0 2022-01-01 4 11 0 2022-01-10 2 12 1 2022-01-10 1 13 0 2022-01-10 3 14 1 2022-01-22 2 15 1 2022-01-01 4 16 1 2022-01-10 2 17 1 2022-01-10 2 18 0 2022-01-10 1 19 1 2022-01-22 1 20 0 2022-01-01 5
Advertisement
Answer
Average of last week
Since there are 7 days, you can divide the count by 7
SELECT u.username, COUNT(u.snapshot_date) / 7 as active_days, 1 as action FROM actions a JOIN users u ON a.user_id = u.user_id WHERE NOT (a.action = 0) GROUP BY u.username, u.snapshot_date;
For the second problem you can average the sum of action:
SELECT u.username, SUM(a.action) / 7 as action_days, 1 as action FROM actions a JOIN users u ON a.user_id = u.user_id WHERE NOT (a.action = 0) GROUP BY u.username, u.snapshot_date;