To byłoby proste. Nie potrzebujesz max()
ani DISTINCT
w tym celu:
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;
Podejrzewam, że twoje pytanie jest niekompletne. Jeśli chcesz:
6 ostatnich odwiedzających z ich ostatnią wizytą na stronie
to potrzebujesz podzapytania. Nie możesz uzyskać tej kolejności sortowania na jednym poziomie zapytania, ani w przypadku DISTINCT ON
, ani z funkcjami okna:
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;
Podzapytanie sub
pobiera ostatnie odwiedziny na użytkownika (ale nie starsze niż dwa miesiące i nie dla określonego użytkownika21
. ORDER BY
musi mieć takie same wiodące kolumny jak DISTINCT ON
.
Potrzebujesz wtedy zewnętrznego zapytania, aby uzyskać 6 ostatnich odwiedzających.
Rozważ kolejność zdarzeń:
Dlaczego NULLS LAST
? Dla pewności nie podałeś definicji tabeli.