To by bylo jednoduché. Nepotřebujete max()
ani DISTINCT
pro toto:
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;
Mám podezření, že vaše otázka je neúplná. Pokud chcete:
6 nejnovějších návštěvníků s poslední návštěvou stránky
pak potřebujete dílčí dotaz. Toto pořadí řazení nemůžete získat na jedné úrovni dotazu, ani s DISTINCT ON
, ani s funkcemi 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;
Poddotaz sub
získá poslední návštěvu na uživatele (ale ne starší než dva měsíce a ne pro určitého návštěvníka21
. ORDER BY
musí mít stejné úvodní sloupce jako DISTINCT ON
.
K získání 6 nejnovějších návštěvníků pak potřebujete vnější dotaz.
Zvažte sled událostí:
Proč NULLS LAST
? Pro jistotu jste nezadali definici tabulky.