Isso seria simples. Você não precisa de
max()
nem DISTINCT
por esta: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;
Suspeito que sua pergunta esteja incompleta. Se você quiser:
os 6 visitantes mais recentes com sua última visita à página
então você precisa de uma subconsulta. Você não pode obter esta ordem de classificação em um nível de consulta, nem com
DISTINCT ON
, nem com funções de janela: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;
A subconsulta
sub
recebe a visita mais recente por usuário (mas não com mais de dois meses e não para um determinado visitante21
. ORDER BY
deve ter as mesmas colunas iniciais que DISTINCT ON
. Você precisa da consulta externa para obter os 6 visitantes mais recentes.
Considere a sequência de eventos:
Por que
NULLS LAST
? Para ter certeza, você não forneceu a definição da tabela.