Ce serait simple. Vous n'avez pas besoin de max()
ni DISTINCT
pour cela :
SELECT *
FROM profile_visits
WHERE social_user_id = 21
AND created_at > (now() - interval '2 months')
AND visitor_id <> 21 -- ??
ORDER BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT 6;
Je soupçonne que votre question est incomplète. Si vous voulez :
les 6 derniers visiteurs avec leur dernière visite sur la page
alors vous avez besoin d'une sous-requête. Vous ne pouvez pas obtenir cet ordre de tri dans un niveau de requête, ni avec DISTINCT ON
, ni avec les fonctions de fenêtre :
SELECT *
FROM (
SELECT DISTINCT ON (visitor_id) *
FROM profile_visits
WHERE social_user_id = 21
AND created_at > (now() - interval '2 months')
AND visitor_id <> 21 -- ??
ORDER BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
) sub
ORDER BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT 6;
La sous-requête sub
obtient la dernière visite par utilisateur (mais pas plus de deux mois et pas pour un certain visiteur21
. ORDER BY
doit avoir les mêmes colonnes de tête que DISTINCT ON
.
Vous avez alors besoin de la requête externe pour obtenir les 6 derniers visiteurs.
Considérez la séquence des événements :
Pourquoi NULLS LAST
? Pour être sûr, vous n'avez pas fourni la définition de la table.