Dat zou eenvoudig zijn. Je hebt max()
. niet nodig noch DISTINCT
hiervoor:
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;
Ik vermoed dat je vraag onvolledig is. Als je wilt:
de 6 laatste bezoekers met hun laatste bezoek aan de pagina
dan heb je een subquery nodig. U kunt deze sorteervolgorde niet op één zoekniveau krijgen, ook niet met DISTINCT ON
, noch met vensterfuncties:
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;
De subquery sub
krijgt het laatste bezoek per gebruiker (maar niet ouder dan twee maanden en niet voor een bepaalde bezoeker21
. ORDER BY
moet dezelfde voorloopkolommen hebben als DISTINCT ON
.
Je hebt dan de buitenste zoekopdracht nodig om de 6 laatste bezoekers te krijgen.
Houd rekening met de volgorde van gebeurtenissen:
Waarom NULLS LAST
? Voor de zekerheid heb je de tabeldefinitie niet opgegeven.