Je travaille à la création d'une vue de base de données qui associe une commande en ligne aux précédentes visites d'un utilisateur sur le site Web. Il s'agit d'un site de commerce électronique où un utilisateur peut visiter et commander plusieurs fois.
J'ai déjà joint la table des visites et la table des commandes sur le nom de l'utilisateur et j'ai associé l'heure inférieure à la session la plus proche à l'heure de la commande. Maintenant, j'espère pouvoir dire que chaque visite jusqu'à la commande n°1 est égale à "1", et que chaque visite suivante jusqu'à la commande n°2 est égale à "2". En outre, s'il n'y a pas d'ID de commande pour cet utilisateur spécifique, j'aimerais renvoyer "0". Voir les captures d'écran liées ci-dessous pour référence.
J'ai déjà essayé d'utiliser dense_rank, mais il ne classe que les lignes dans lesquelles un order_id est présent. Je veux reporter ces classements.
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;