Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta DISTINCT ON com valor máximo ORDER BY de uma coluna


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.