Das wäre einfach. Sie brauchen max() nicht noch DISTINCT dazu:
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;
Ich vermute, Ihre Frage ist unvollständig. Wenn Sie möchten:
die 6 letzten Besucher mit ihrem letzten Besuch auf der Seite
Dann brauchen Sie eine Unterabfrage. Sie können diese Sortierreihenfolge nicht in einer Abfrageebene erhalten, auch nicht mit DISTINCT ON , noch mit Fensterfunktionen:
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;
Die Unterabfrage sub erhält den letzten Besuch pro Benutzer (jedoch nicht älter als zwei Monate und nicht für einen bestimmten Besucher21 . ORDER BY muss dieselben führenden Spalten wie DISTINCT ON haben .
Sie benötigen dann die äußere Abfrage, um die 6 letzten Besucher zu erhalten.
Beachten Sie die Reihenfolge der Ereignisse:
Warum NULLS LAST ? Allerdings haben Sie die Tabellendefinition nicht angegeben.