Điều đó sẽ đơn giản. Bạn không cần max()
cũng không phải DISTINCT
cho điều này:
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;
Tôi nghi ngờ câu hỏi của bạn là không đầy đủ. Nếu bạn muốn:
6 khách truy cập mới nhất có lượt truy cập mới nhất vào trang
thì bạn cần một truy vấn con. Bạn không thể nhận thứ tự sắp xếp này ở một cấp truy vấn, với DISTINCT ON
, cũng như với các chức năng cửa sổ:
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;
Truy vấn con sub
nhận được lượt truy cập mới nhất cho mỗi người dùng (nhưng không quá hai tháng và không dành cho một khách truy cập nhất định 21
. ORDER BY
phải có các cột ở đầu giống như DISTINCT ON
.
Khi đó, bạn cần truy vấn bên ngoài để có được 6 khách truy cập mới nhất.
Hãy xem xét chuỗi sự kiện:
Tại sao NULLS LAST
? Để chắc chắn, bạn đã không cung cấp định nghĩa bảng.