Mysql
 sql >> Database >  >> RDS >> Mysql

DISTINCT ON query w/ ORDER BY valore massimo di una colonna

Sarebbe semplice. Non hai bisogno di max()DISTINCT per questo:

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;

Sospetto che la tua domanda sia incompleta. Se vuoi:
gli ultimi 6 visitatori con la loro ultima visita alla pagina
allora hai bisogno di una sottoquery. Non puoi ottenere questo ordinamento in un livello di query, né con DISTINCT ON , né con le funzioni della finestra:

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 sottoquery sub riceve l'ultima visita per utente (ma non più vecchia di due mesi e non per un determinato visitatore21 . ORDER BY deve avere le stesse colonne iniziali di DISTINCT ON .

Allora hai bisogno della query esterna per ottenere gli ultimi 6 visitatori.
Considera la sequenza degli eventi:

Perché NULLS LAST ? A dire il vero, non hai fornito la definizione della tabella.