Если вы используете СУБД, поддерживающую оконные функции, вы можете использовать пару CTE, чтобы сначала разделить строки на разные покупки, затем найти номер строки относительно каждой из этих покупок и, наконец, вычислить Path
на основе заданных вами условий:
WITH purchases AS (
SELECT "Row", User_ID, Event_Time, Event_Type,
COALESCE(SUM(CASE WHEN Event_Type = 'Purchase' THEN 1 ELSE 0 END) OVER
(PARTITION BY User_ID ORDER BY Event_Time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS pnum
FROM events
),
prows AS (
SELECT "Row", User_ID, Event_Time, Event_Type, pnum,
ROW_NUMBER() OVER (PARTITION BY User_ID, pnum ORDER BY Event_Time) AS rn,
ROW_NUMBER() OVER (PARTITION BY User_ID, pnum ORDER BY Event_Time DESC) AS drn
FROM purchases
)
SELECT "Row", User_ID, Event_Time, Event_Type,
CASE WHEN Event_Type = 'Purchase' OR
NOT EXISTS (SELECT *
FROM prows r2
WHERE r2.User_ID = r1.User_ID
AND r2.pnum = r1.pnum
AND r2.Event_Type = 'Purchase') THEN NULL
WHEN rn = 1 AND drn = 2 THEN 'Only'
WHEN rn = 1 THEN 'Introducer'
WHEN drn = 2 THEN 'Closer'
ELSE 'Influencer'
END AS Path
FROM prows r1
ORDER BY User_ID, Event_Time
Вывод:
Row User_ID Event_Time Event_Type Path
1 1 2020-01-01 View Introducer
2 1 2020-01-02 Click Closer
3 1 2020-01-03 Purchase (null)
4 2 2020-02-01 View Introducer
5 2 2020-02-02 Click Influencer
6 2 2020-02-03 View Closer
7 2 2020-02-04 Purchase (null)
8 2 2020-02-11 View Only
9 2 2020-02-12 Purchase (null)
10 2 2020-02-21 View Introducer
11 2 2020-02-22 Click Closer
12 2 2020-02-23 Purchase (null)
13 2 2020-02-27 View (null)
14 2 2020-02-28 Click (null)
15 3 2020-03-01 View Only
16 3 2020-03-02 Purchase (null)
SQL Демонстрация сервера на SQLFiddle . Тот же запрос будет выполняться для PostgreSQL и Oracle.