( Заявление об ограничении ответственности: У меня нет Snowflake, поэтому я не пробовал и не тестировал. Я тестировал его на MS SQL.)
/*
DECLARE @deal_views AS TABLE (
id int PRIMARY KEY IDENTITY(1,1),
[user_id] INT NOT NULL,
viewed_at DATETIME NOT NULL);
DECLARE @purchases AS TABLE (
id int PRIMARY KEY IDENTITY(1,1),
[user_id] INT NOT NULL,
purchased_at DATETIME NOT NULL);
INSERT INTO @deal_views VALUES
(1, '2020-07-12 15:00:00'), (1, '2020-07-12 14:00:00'), (1, '2020-07-12 13:00:00'),
(1, '2020-07-03 09:00:00'),
(2, '2020-07-12 15:00:00'), (2, '2020-07-12 14:00:00'), (2, '2020-07-12 13:00:00'),
(3, '2020-07-12 15:00:00')
INSERT INTO @purchases VALUES
(1, '2020-07-03 09:02:10'),
(1, '2020-07-12 14:04:53'),
(2, '2020-07-12 15:20:12')*/
SELECT p.[user_id], MAX(d.viewed_at) AS viewed_at
FROM purchases p
JOIN deal_views d
ON p.[user_id] = d.[user_id]
AND p.purchased_at > d.viewed_at
GROUP BY p.[user_id], p.purchased_at
Вывод :
![Output](https://i.stack.imgur.com/4Y4aH.png)
DB Fiddle Demo
Если вам нужны другие атрибуты из deal_views, присоедините их обратно к представлению сделок.
SELECT d.id,
d.user_id,
d.viewed_at,
d.attributes2, d.attributes3, d.attributes4
FROM (
SELECT p.[user_id], MAX(d.viewed_at) AS viewed_at
FROM purchases p
JOIN deal_views d
ON p.[user_id] = d.[user_id]
AND p.purchased_at > d.viewed_at
GROUP BY p.[user_id], p.purchased_at) mv
JOIN deal_views d
ON mv.[user_id] = d.[user_id]
AND mv.viewed_at > d.viewed_at