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.