Eso sería sencillo. No necesitas max()
ni DISTINCT
por esto:
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;
Sospecho que tu pregunta está incompleta. Si quieres:
los 6 últimos visitantes con su última visita a la página
entonces necesita una subconsulta. No puede obtener este orden de clasificación en un nivel de consulta, ni con DISTINCT ON
, ni con funciones de ventana:
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 subconsulta sub
obtiene la última visita por usuario (pero no mayor de dos meses y no para un visitante determinado21
. ORDER BY
debe tener las mismas columnas iniciales que DISTINCT ON
.
Entonces necesita la consulta externa para obtener los 6 últimos visitantes.
Considere la secuencia de eventos:
Por qué NULLS LAST
? Sin duda, no proporcionó la definición de la tabla.