Det ville være enkelt. Du behøver ikke max()
heller ikke DISTINCT
til dette:
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;
Jeg formoder, at dit spørgsmål er ufuldstændigt. Hvis du vil:
de 6 seneste besøgende med deres seneste besøg på siden
så har du brug for en underforespørgsel. Du kan ikke få denne sorteringsrækkefølge på ét forespørgselsniveau, hverken med DISTINCT ON
, og heller ikke med vinduesfunktioner:
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;
Underforespørgslen sub
får det seneste besøg pr. bruger (men ikke ældre end to måneder og ikke for en bestemt besøgende21
. ORDER BY
skal have de samme indledende kolonner som DISTINCT ON
.
Du skal bruge den ydre forespørgsel for at få de seneste 6 besøgende.
Tænk på rækkefølgen af begivenheder:
Hvorfor NULLS LAST
? For at være sikker har du ikke angivet tabeldefinitionen.