@@ -132,15 +132,35 @@ const buildStepQuery = (
132132 const referrerSelectCustom = includeReferrer ? ", '' as referrer" : '' ;
133133
134134 return `
135+ WITH filtered_sessions AS (
136+ SELECT DISTINCT session_id
137+ FROM analytics.events
138+ WHERE client_id = {websiteId:String}
139+ AND time >= parseDateTimeBestEffort({startDate:String})
140+ AND time <= parseDateTimeBestEffort({endDate:String})
141+ AND event_name = {${ targetKey } :String}${ filterConditions }
142+ ),
143+ session_referrers AS (
144+ SELECT
145+ session_id,
146+ argMin(referrer, time) as session_referrer
147+ FROM analytics.events
148+ WHERE client_id = {websiteId:String}
149+ AND time >= parseDateTimeBestEffort({startDate:String})
150+ AND time <= parseDateTimeBestEffort({endDate:String})
151+ AND event_name = 'screen_view'
152+ AND referrer != ''
153+ GROUP BY session_id
154+ )
135155 SELECT
136156 ${ stepIndex + 1 } as step_number,
137157 {${ stepNameKey } :String} as step_name,
138158 session_id,
139- MIN(first_occurrence) as first_occurrence${ referrerSelect }
159+ MIN(first_occurrence) as first_occurrence${ includeReferrer ? ', COALESCE(sr.session_referrer, \'\') as referrer' : '' }
140160 FROM (
141161 SELECT
142162 session_id,
143- time as first_occurrence${ includeReferrer ? ', referrer' : '' }
163+ time as first_occurrence
144164 FROM analytics.events
145165 WHERE client_id = {websiteId:String}
146166 AND time >= parseDateTimeBestEffort({startDate:String})
@@ -150,15 +170,17 @@ const buildStepQuery = (
150170 UNION ALL
151171
152172 SELECT
153- session_id,
154- timestamp as first_occurrence${ referrerSelectCustom }
155- FROM analytics.custom_events
156- WHERE client_id = {websiteId:String}
157- AND timestamp >= parseDateTimeBestEffort({startDate:String})
158- AND timestamp <= parseDateTimeBestEffort({endDate:String})
159- AND event_name = {${ targetKey } :String}
160- )
161- GROUP BY session_id` ;
173+ ce.session_id,
174+ ce.timestamp as first_occurrence
175+ FROM analytics.custom_events ce
176+ INNER JOIN filtered_sessions fs ON ce.session_id = fs.session_id
177+ WHERE ce.client_id = {websiteId:String}
178+ AND ce.timestamp >= parseDateTimeBestEffort({startDate:String})
179+ AND ce.timestamp <= parseDateTimeBestEffort({endDate:String})
180+ AND ce.event_name = {${ targetKey } :String}
181+ )${ includeReferrer ? `
182+ LEFT JOIN session_referrers sr ON session_id = sr.session_id` : '' }
183+ GROUP BY session_id${ includeReferrer ? ', sr.session_referrer' : '' } ` ;
162184} ;
163185
164186const processSessionEvents = (
@@ -220,7 +242,7 @@ const calculateStepCounts = (
220242) : Map < number , Set < string > > => {
221243 const stepCounts = new Map < number , Set < string > > ( ) ;
222244
223- for ( const [ sessionId , events ] of sessionEvents ) {
245+ for ( const [ sessionId , events ] of Array . from ( sessionEvents . entries ( ) ) ) {
224246 events . sort ( ( a , b ) => a . first_occurrence - b . first_occurrence ) ;
225247 let currentStep = 1 ;
226248
@@ -674,7 +696,7 @@ const calculateReferrerStepCounts = (
674696) : Map < number , Set < string > > => {
675697 const stepCounts = new Map < number , Set < string > > ( ) ;
676698
677- for ( const sessionId of group . sessionIds ) {
699+ for ( const sessionId of Array . from ( group . sessionIds ) ) {
678700 const events = sessionEvents
679701 . get ( sessionId )
680702 ?. sort ( ( a , b ) => a . first_occurrence - b . first_occurrence ) ;
@@ -863,7 +885,7 @@ export const processFunnelAnalyticsByReferrer = async (
863885 }
864886 > ( ) ;
865887
866- for ( const [ sessionId , events ] of sessionEvents ) {
888+ for ( const [ sessionId , events ] of Array . from ( sessionEvents . entries ( ) ) ) {
867889 if ( events . length > 0 ) {
868890 const referrer = events [ 0 ] . referrer || 'Direct' ;
869891 const parsed = parseReferrer ( referrer ) ;
@@ -878,7 +900,7 @@ export const processFunnelAnalyticsByReferrer = async (
878900
879901 const referrerAnalytics : ReferrerAnalytics [ ] = [ ] ;
880902
881- for ( const [ groupKey , group ] of referrerGroups ) {
903+ for ( const [ groupKey , group ] of Array . from ( referrerGroups . entries ( ) ) ) {
882904 const analytics = processReferrerGroup (
883905 groupKey ,
884906 group ,
0 commit comments