SQL Server, . , page 'buy', min i.e, , 'store'
:
DECLARE @table TABLE
(
session VARCHAR(1),
hit_number INT,
page VARCHAR(50)
);
INSERT INTO @table VALUES
('a',1,'homepage'),
('a',2,'generic_page'),
('a',3,'shoe_store'),
('a',4,'buy_add_basket'),
('a',5,'buy_checkout'),
('b',1,'sock_store'),
('b',2,'shoe_store'),
('b',3,'buy_add_to_basket'),
('b',4,'buy_checkout'),
('c',1,'homepage'),
('c',2,'sock_store'),
('c',3,'sock_store'),
('c',4,'buy_add_to_basket'),
('c',5,'home_page'),
('c',6,'shoe_store'),
('a',5,'home_page');
Select * From @table :
session hit_number page
a 1 homepage
a 2 generic_page
a 3 shoe_store
a 4 buy_add_basket
a 5 buy_checkout
b 1 sock_store
b 2 shoe_store
b 3 buy_add_to_basket
b 4 buy_checkout
c 1 homepage
c 2 sock_store
c 3 sock_store
c 4 buy_add_to_basket
c 5 home_page
c 6 shoe_store
a 5 home_page
Query:
SELECT
session,
hit_number,
page,
CASE
WHEN page LIKE 'buy%'
THEN MIN(CASE
WHEN page LIKE '%store'
THEN page
ELSE NULL
END) OVER(PARTITION BY session ORDER BY hit_number)
ELSE NULL
END AS previous_buy_page
FROM @table;
:
session hit_number page previous_buy_page
a 1 homepage NULL
a 2 generic_page NULL
a 3 shoe_store NULL
a 4 buy_add_basket shoe_store
a 5 buy_checkout shoe_store
a 5 home_page NULL
b 1 sock_store NULL
b 2 shoe_store NULL
b 3 buy_add_to_basket shoe_store
b 4 buy_checkout shoe_store
c 1 homepage NULL
c 2 sock_store NULL
c 3 sock_store NULL
c 4 buy_add_to_basket sock_store
c 5 home_page NULL
c 6 shoe_store NULL