Това би било просто. Нямате нужда от max()
нито DISTINCT
за това:
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;
Подозирам, че въпросът ви е непълен. Ако искате:
6-те последни посетители с последното им посещение на страницата
тогава имате нужда от подзаявка. Не можете да получите този ред на сортиране в едно ниво на заявка, нито с DISTINCT ON
, нито с функции на прозореца:
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;
Подзаявката sub
получава последното посещение на потребител (но не по-старо от два месеца и не за определен посетител21
. ORDER BY
трябва да има същите водещи колони като DISTINCT ON
.
Нуждаете се от външната заявка, за да получите 6-те последни посетители.
Помислете за последователността от събития:
Защо NULLS LAST
? За да сте сигурни, не сте предоставили дефиницията на таблицата.