我正在创建一个数据库视图,将在线订单与网站访问之前的用户关联起来。这适用于电子商务网站,因此一个用户可以访问和订购多次。
我已经在 user_id 上加入了访问表和订单表,并将最近的小于会话时间与订单时间相关联。现在,我希望在订单#1 之前的每次访问都是“1”,然后在访问之后直到订单#2 是“2”。此外,如果该特定用户没有 order_id,我想返回“0”。请参阅下面链接的屏幕截图以供参考。
我已经尝试使用dense_rank,但它只对存在order_id 的行进行排名。我想发扬这些行列。
SELECT v.id AS visit_id,
v.user_id,
v.started_at AS visit_date,
dense_rank() OVER (PARTITION BY v.user_id ORDER BY v.started_at) AS visit_number,
dense_rank() OVER (PARTITION BY v.user_id ORDER BY o.id) AS order_number,
o.id AS order_id,
o.created_at AS order_date
FROM visits v
FULL JOIN orders o ON v.user_id = o.user_id AND v.started_at < o.created_at AND o.created_at < (( SELECT min(visits.started_at) AS min
FROM visits
WHERE visits.user_id = v.user_id AND visits.started_at > v.started_at)) AND (v.started_at + '24:00:00'::interval) > o.created_at
GROUP BY v.id, v.user_id, v.started_at, o.id, o.created_at
ORDER BY v.started_at;