sql >> Base de Datos >  >> RDS >> Mysql

DISTINCT ON consulta con ORDER BY valor máximo de una columna

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.