Mysql
 sql >> Base de données >  >> RDS >> Mysql

DISTINCT ON requête avec ORDER BY valeur max d'une colonne

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.