Skip to content

Commit a52f326

Browse files
committed
Fixed channel metrics queries.
1 parent 8a39e98 commit a52f326

2 files changed

Lines changed: 104 additions & 49 deletions

File tree

src/queries/sql/getChannelExpandedMetrics.ts

Lines changed: 64 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,16 @@ async function relationalQuery(
6262
website_event.session_id,
6363
website_event.visit_id,
6464
website_event.hostname,
65-
count(*) c,
66-
min(website_event.created_at) min_time,
67-
max(website_event.created_at) max_time
65+
website_event.event_id,
66+
website_event.created_at
6867
from website_event
6968
${cohortQuery}
7069
${excludeBounceQuery}
7170
${joinSessionQuery}
7271
where website_event.website_id = {{websiteId::uuid}}
7372
and website_event.event_type NOT IN (2, 5)
7473
${dateQuery}
75-
${filterQuery}
76-
group by prefix,
77-
website_event.referrer_domain,
78-
website_event.url_query,
79-
website_event.utm_medium,
80-
website_event.utm_source,
81-
website_event.session_id,
82-
website_event.visit_id,
83-
website_event.hostname),
74+
${filterQuery}),
8475
8576
channels as (
8677
select case
@@ -99,21 +90,50 @@ async function relationalQuery(
9990
else '' end as "name",
10091
session_id,
10192
visit_id,
102-
c,
103-
min_time,
104-
max_time
105-
from prefix)
93+
event_id,
94+
created_at
95+
from prefix),
96+
97+
visit_channels as (
98+
select
99+
session_id,
100+
visit_id,
101+
coalesce(nullif(name, ''), 'direct') as "name"
102+
from (
103+
select
104+
name,
105+
session_id,
106+
visit_id,
107+
row_number() over (
108+
partition by session_id, visit_id
109+
order by case when name != '' then 0 else 1 end, created_at, event_id
110+
) as row_num
111+
from channels
112+
) as ranked_channels
113+
where row_num = 1),
114+
115+
visit_stats as (
116+
select
117+
session_id,
118+
visit_id,
119+
count(*) as c,
120+
min(created_at) as min_time,
121+
max(created_at) as max_time
122+
from prefix
123+
group by session_id, visit_id)
106124
107125
select
108-
name,
109-
sum(c) as "pageviews",
110-
count(distinct session_id) as "visitors",
111-
count(distinct visit_id) as "visits",
112-
sum(case when c = 1 then 1 else 0 end) as "bounces",
113-
sum(${getTimestampDiffSQL('min_time', 'max_time')}) as "totaltime"
114-
from channels
115-
where name != ''
116-
group by name
126+
visit_channels.name,
127+
sum(visit_stats.c) as "pageviews",
128+
count(distinct visit_stats.session_id) as "visitors",
129+
count(distinct visit_stats.visit_id) as "visits",
130+
sum(case when visit_stats.c = 1 then 1 else 0 end) as "bounces",
131+
sum(${getTimestampDiffSQL('visit_stats.min_time', 'visit_stats.max_time')}) as "totaltime"
132+
from visit_stats
133+
join visit_channels
134+
on visit_channels.session_id = visit_stats.session_id
135+
and visit_channels.visit_id = visit_stats.visit_id
136+
group by visit_channels.name
117137
order by visitors desc, visits desc
118138
`,
119139
queryParams,
@@ -142,6 +162,14 @@ async function clickhouseQuery(
142162
sum(max_time-min_time) as "totaltime"
143163
from (
144164
select
165+
session_id,
166+
visit_id,
167+
coalesce(nullIf(argMin(name, tuple(if(name != '', 0, 1), created_at, event_id)), ''), 'direct') as name,
168+
count(*) c,
169+
min(created_at) min_time,
170+
max(created_at) max_time
171+
from (
172+
select
145173
case when multiSearchAny(lower(utm_medium), ['cp', 'ppc', 'retargeting', 'paid']) != 0 then 'paid' else 'organic' end prefix,
146174
case
147175
when referrer_domain = '' and url_query = '' then 'direct'
@@ -173,18 +201,17 @@ async function clickhouseQuery(
173201
else '' end AS "name",
174202
session_id,
175203
visit_id,
176-
count(*) c,
177-
min(created_at) min_time,
178-
max(created_at) max_time
179-
from website_event
180-
${cohortQuery}
181-
${excludeBounceQuery}
182-
where website_id = {websiteId:UUID}
183-
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
184-
and event_type NOT IN (2, 5)
185-
and name != ''
186-
${filterQuery}
187-
group by prefix, name, session_id, visit_id
204+
event_id,
205+
created_at
206+
from website_event
207+
${cohortQuery}
208+
${excludeBounceQuery}
209+
where website_id = {websiteId:UUID}
210+
and created_at between {startDate:DateTime64} and {endDate:DateTime64}
211+
and event_type NOT IN (2, 5)
212+
${filterQuery}
213+
)
214+
group by session_id, visit_id
188215
) as t
189216
group by name
190217
order by visitors desc, visits desc;

src/queries/sql/getChannelMetrics.ts

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
4141
website_event.utm_medium,
4242
website_event.utm_source,
4343
website_event.session_id,
44+
website_event.visit_id,
45+
website_event.event_id,
46+
website_event.created_at,
4447
website_event.hostname
4548
from website_event
4649
${cohortQuery}
@@ -66,14 +69,32 @@ async function relationalQuery(websiteId: string, filters: QueryFilters) {
6669
when ${toPostgresLikeClause('referrer_domain', VIDEO_DOMAINS)} or utm_medium ilike '%video%' then concat(prefix, 'Video')
6770
when referrer_domain != regexp_replace(hostname, '^www.', '') and referrer_domain != '' then 'referral'
6871
else '' end AS x,
69-
count(distinct session_id) y
70-
from prefix
71-
group by 1
72-
order by y desc)
72+
session_id,
73+
visit_id,
74+
event_id,
75+
created_at
76+
from prefix),
7377
74-
select x, sum(y) y
75-
from channels
76-
where x != ''
78+
visit_channels as (
79+
select
80+
session_id,
81+
visit_id,
82+
coalesce(nullif(x, ''), 'direct') as x
83+
from (
84+
select
85+
x,
86+
session_id,
87+
visit_id,
88+
row_number() over (
89+
partition by session_id, visit_id
90+
order by case when x != '' then 0 else 1 end, created_at, event_id
91+
) as row_num
92+
from channels
93+
) as ranked_channels
94+
where row_num = 1)
95+
96+
select x, count(distinct session_id) y
97+
from visit_channels
7798
group by x
7899
order by y desc;
79100
`,
@@ -94,6 +115,11 @@ async function clickhouseQuery(
94115

95116
const sql = `
96117
WITH channels as (
118+
select
119+
session_id,
120+
visit_id,
121+
coalesce(nullIf(argMin(x, tuple(if(x != '', 0, 1), created_at, event_id)), ''), 'direct') as x
122+
from (
97123
select
98124
case when multiSearchAny(lower(utm_medium), ['cp', 'ppc', 'retargeting', 'paid']) != 0 then 'paid' else 'organic' end prefix,
99125
case
@@ -124,20 +150,22 @@ async function clickhouseQuery(
124150
)}]) != 0 or position(lower(utm_medium), 'video') > 0 then concat(prefix, 'Video')
125151
when referrer_domain != hostname and referrer_domain != '' then 'referral'
126152
else '' end AS x,
127-
count(distinct session_id) y
153+
session_id,
154+
visit_id,
155+
event_id,
156+
created_at
128157
from website_event
129158
${cohortQuery}
130159
${excludeBounceQuery}
131160
where website_id = {websiteId:UUID}
132161
and event_type NOT IN (2, 5)
133162
${dateQuery}
134163
${filterQuery}
135-
group by 1, 2
136-
order by y desc)
164+
)
165+
group by session_id, visit_id)
137166
138-
select x, sum(y) y
167+
select x, uniq(session_id) y
139168
from channels
140-
where x != ''
141169
group by x
142170
order by y desc;
143171
`;

0 commit comments

Comments
 (0)