Funnel de conversion : taux par étape en une requête
Compter les utilisateurs distincts à chaque étape avec FILTER, puis dérouler le funnel en lignes via LATERAL VALUES pour calculer le taux global et le taux étape par étape.
Cas d'usage
Mesurer où les utilisateurs abandonnent entre la vue produit et le paiement.
Prérequis
PostgreSQL 9.4+ (FILTER, LATERAL)
SQL
WITH steps AS (
SELECT
COUNT(DISTINCT user_id) FILTER (WHERE event = 'view_product') AS s1,
COUNT(DISTINCT user_id) FILTER (WHERE event = 'add_to_cart') AS s2,
COUNT(DISTINCT user_id) FILTER (WHERE event = 'checkout') AS s3,
COUNT(DISTINCT user_id) FILTER (WHERE event = 'payment_ok') AS s4
FROM events
WHERE event_time >= CURRENT_DATE - 7
)
SELECT
v.step,
v.users,
ROUND(100.0 * v.users / FIRST_VALUE(v.users) OVER w, 1) AS pct_total,
ROUND(100.0 * v.users / NULLIF(LAG(v.users) OVER w, 0), 1) AS pct_prev
FROM steps s
CROSS JOIN LATERAL (VALUES
(1, 'Vue produit', s.s1), (2, 'Ajout panier', s.s2),
(3, 'Checkout', s.s3), (4, 'Paiement', s.s4)
) AS v(ord, step, users)
WINDOW w AS (ORDER BY v.ord)
ORDER BY v.ord;Résultat
step | users | pct_total | pct_prev --------------+-------+-----------+---------- Vue produit | 48210 | 100.0 | Ajout panier | 12480 | 25.9 | 25.9 Checkout | 6840 | 14.2 | 54.8 Paiement | 5210 | 10.8 | 76.2 (4 rows)
SQLFunnelConversionProduct analytics