From 1dcb2c21216974399b3e589d52b723ca890a6d54 Mon Sep 17 00:00:00 2001 From: Diana Shalai Date: Fri, 10 Oct 2025 11:45:39 +0200 Subject: [PATCH] fix: user acquisition first user with last non direct source --- ...nt_segment__sessions_first_touch_point.sql | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/models/50_intermediate/segment/int_segment__sessions_first_touch_point.sql b/models/50_intermediate/segment/int_segment__sessions_first_touch_point.sql index 52b6503..139b049 100644 --- a/models/50_intermediate/segment/int_segment__sessions_first_touch_point.sql +++ b/models/50_intermediate/segment/int_segment__sessions_first_touch_point.sql @@ -1,31 +1,59 @@ {{ config(materialized="incremental", unique_key="canonical_segment_id") }} with - first_touch_anonymous as ( + all_sessions as ( select anonymous_id, canonical_segment_id_with_fallback as canonical_segment_id, - min(session_start_tstamp) as record_timestamp + referrer_source as src, + referrer_medium as med, + referrer_id as id, + session_start_tstamp as ts from {{ ref("int_segment__sessions") }} + ), + + agg as ( + select + canonical_segment_id, + anonymous_id, + array_agg(struct(src, med, id, ts) order by ts) as all_touches, + array_agg( + if( + src in ('direct', 'session_continue'), + null, + struct(src, med, id, ts) + ) + ignore nulls + order by ts + ) as non_direct_touches + from all_sessions group by 1, 2 ), first_touch_canonical as ( select - fa.anonymous_id, - fa.canonical_segment_id, - fa.record_timestamp, - s.referrer_id, - s.referrer_source, - s.referrer_medium - from first_touch_anonymous as fa - left join - {{ ref("int_segment__sessions") }} as s - on fa.anonymous_id = s.anonymous_id - and fa.record_timestamp = s.session_start_tstamp + canonical_segment_id, + anonymous_id, + coalesce( + (non_direct_touches[safe_offset(0)]).src, + (all_touches[safe_offset(0)]).src + ) as referrer_source, + coalesce( + (non_direct_touches[safe_offset(0)]).med, + (all_touches[safe_offset(0)]).med + ) as referrer_medium, + coalesce( + (non_direct_touches[safe_offset(0)]).id, + (all_touches[safe_offset(0)]).id + ) as referrer_id, + coalesce( + (non_direct_touches[safe_offset(0)]).ts, + (all_touches[safe_offset(0)]).ts + ) as record_timestamp + from agg qualify row_number() over ( - partition by fa.canonical_segment_id order by fa.record_timestamp asc + partition by canonical_segment_id order by record_timestamp asc ) = 1 )