Sarebbe semplice. Non hai bisogno di max()
né 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.