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.