runtime
69 / 88

task Medians, shares & ratios · hard

Checkout review 3: measure the delay tail

For each first-touch channel with converted sessions, report converted_sessions, avg_seconds from checkout to purchase rounded to two decimals, and the nearest-rank p90_seconds.

what to return

Columns
channelconverted_sessionsavg_secondsp90_seconds in this order
Rows
3 rows · in the order asked
Watch for
This stage starts from the original event tables in a fresh database. Recompute any intermediate results; nothing is carried over from earlier stages.
Deduplicate globally by event_key, keeping the smallest id; a retry may have a conflicting payload.
Use (occurred_at, id) as the total event order; equal timestamps follow id order. All times are UTC.
A shopper starts a session at the first canonical event or after a gap strictly greater than 30 minutes from their previous canonical event. Exactly 30 minutes stays in the same session; midnight alone does not split it.
Session numbers start at 1 per shopper and include every event type, including heartbeat and purchase-only sessions.
A converted session has a view → checkout → purchase in that order, with all three events for the same shopper/cart within the session. Use the total event order. No extra view-to-purchase time limit applies.
Within a session choose the earliest qualifying purchase in total event order. For that purchase choose the latest preceding same-cart checkout that has an earlier same-cart view in the session.
Measure elapsed seconds from that checkout to purchase. Attribute to the session’s first-event channel. For n sessions, nearest-rank p90 is the sorted value at ceil(0.9*n), one-based. Include no unconverted sessions; order by channel.
Skill
Measure checkout latency without weighting sessions by repeated attempts. Refresher: Sessionize an event stream →

expected result

Your query should return exactly these columns and values. Run it and compare.

expected result3 rows · in this order
channelconverted_sessionsavg_secondsp90_seconds
email2180300
search2540900
social100

all 3 rows

data you can query

Sample rows from each table. Each column shows its type underneath; → marks a link to another table.

market_web_events7 columns · 38 rows
idinteger · keyevent_keytextshopper_idinteger → shoppersoccurred_attextevent_typetextchanneltextcart_idtext
1a112025-05-01 09:00:00viewemailA
2a212025-05-01 09:05:00checkoutdirectA
3a312025-05-01 09:10:00purchasedirectA
4a312025-05-01 09:10:00purchasedirectA
5b112025-05-01 10:00:00viewsearchB

showing 5 of 38 rows

solution.sql
 

Hints and the answer are always available. Using them counts the question as solved with help.