-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweekly-kpis.sql
124 lines (123 loc) · 3.16 KB
/
weekly-kpis.sql
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
SELECT
sessions.Year,
sessions.Week,
sessions.CountryCode,
CASE
WHEN sessions.DeviceType = 0 THEN 'None'
WHEN sessions.DeviceType = 1 THEN 'Ios'
WHEN sessions.DeviceType = 2 THEN 'Android'
WHEN sessions.DeviceType = 3 THEN 'Windows'
WHEN sessions.DeviceType = 4 THEN 'Macos'
WHEN sessions.DeviceType = 5 THEN 'Linux'
ELSE
'Unknown'
END
AS DeviceType,
sessions.DeviceModel,
WeeklySessions,
UniqueUser,
COALESCE(NewUser, 0) AS NewUser,
CASE WHEN (UniqueUser - NewUser IS NULL) THEN UniqueUser ELSE UniqueUser - NewUser END AS ReturnedUser,
COALESCE(Revenue, 0) AS Revenue,
COALESCE(OrderCount, 0) AS OrderCount
FROM (
SELECT
EXTRACT(YEAR FROM CreationTime) AS Year,
EXTRACT(ISOWEEK FROM CreationTime) AS Week,
CountryCode,
DeviceType,
DeviceModel,
COUNT(Id) AS WeeklySessions,
COUNT(DISTINCT UserId) AS UniqueUser
FROM (
SELECT
nll.*,
au.CountryCode AS CountryCode,
au.DeviceType AS DeviceType,
au.DeviceModel as DeviceModel
FROM
`xxx.db.LoginLog` nll
LEFT JOIN
`xxx.db.AbpUser` au
ON
nll.UserId = au.Id )
GROUP BY
Year,
Week,
CountryCode,
DeviceType,
DeviceModel
ORDER BY
Year ASC,
Week ASC,
WeeklySessions DESC) AS sessions
LEFT JOIN (
SELECT
EXTRACT(YEAR FROM CreationTime) AS Year,
EXTRACT(ISOWEEK FROM CreationTime) AS Week,
CountryCode,
DeviceType,
DeviceModel,
COUNT(DISTINCT Id) AS NewUser
FROM
`xxx.db.AbpUser`
WHERE
CAST(CreationTime AS Date) >="2022-12-09"
GROUP BY
Year,
Week,
CountryCode,
DeviceType,
DeviceModel
ORDER BY
Year ASC,
Week ASC,
NewUser DESC) AS new_users
ON
sessions.Year = new_users.Year
AND sessions.Week = new_users.Week
AND sessions.CountryCode = new_users.CountryCode
AND sessions.DeviceType=new_users.DeviceType
AND sessions.DeviceModel = new_users.DeviceModel
LEFT JOIN (
SELECT
EXTRACT(YEAR FROM CreationTime) AS Year,
EXTRACT(ISOWEEK FROM CreationTime) AS Week,
au.CountryCode,
au.DeviceType,
au.DeviceModel,
SUM(p.Price) AS Revenue,
COUNT(o.Id) AS OrderCount
FROM
`xxx.db.Order` o
LEFT JOIN
`xxx.db.AbpUser` au
ON
au.Id = o.UserId
LEFT JOIN
`xxx.db.Product` p
ON
p.Id = o.ProductId
WHERE
p.CurrencyType = 5
AND CAST(o.CreationTime AS Date) >="2022-12-09"
GROUP BY
Year,
Week,
CountryCode,
DeviceType,
DeviceModel
ORDER BY
Year ASC,
Week ASC) AS orders
ON
sessions.Year = orders.Year
AND sessions.Week = orders.Week
AND sessions.CountryCode = orders.CountryCode
AND sessions.DeviceType = orders.DeviceType
AND sessions.DeviceModel = orders.DeviceModel
ORDER BY
sessions.Year ASC,
sessions.Week ASC,
sessions.WeeklySessions DESC;
//I had created daily KPIs, but it would be incorrect to evaluate daily data on a weekly basis because each data point was grouped separately by day. If we aggregate them weekly, we wouldn’t be able to count many metrics, such as users, as unique. Therefore, tracking on a monthly and weekly basis separately would be more effective for understanding unique user behavior in these periods.