Itu akan sederhana. Anda tidak perlu max() atau DISTINCT untuk ini:
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;
Saya menduga pertanyaan Anda tidak lengkap. Jika Anda ingin:
6 pengunjung terbaru dengan kunjungan terakhir mereka ke halaman
maka Anda memerlukan subquery. Anda tidak bisa mendapatkan urutan pengurutan ini dalam satu tingkat kueri, juga dengan DISTINCT ON , atau dengan fungsi jendela:
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;
Subkueri sub mendapat kunjungan terakhir per pengguna (tetapi tidak lebih dari dua bulan dan bukan untuk pengunjung tertentu21 . ORDER BY harus memiliki kolom utama yang sama dengan DISTINCT ON .
Anda memerlukan kueri luar untuk mendapatkan 6 pengunjung terbaru.
Pertimbangkan urutan acara:
Mengapa NULLS LAST ? Yang pasti, Anda tidak memberikan definisi tabel.