Nếu bạn không có slno
trong bảng của bạn, thì bạn không có bất kỳ thông tin đáng tin cậy nào mà hàng đã được chèn trước. Không có thứ tự tự nhiên trong bảng, thứ tự vật lý của các hàng có thể thay đổi bất kỳ lúc nào (với bất kỳ bản cập nhật nào hoặc với VACUUM
, v.v.)
Bạn có thể sử dụng không đáng tin cậy mẹo:đặt hàng theo ctid
nội bộ .
select *
from (
select id, status
, row_number() OVER (PARTITION BY id
ORDER BY date, ctid) AS row_num
from status -- that's your table name??
where date >= '2015-06-01' -- assuming column is actually a date
and date < '2015-07-01'
) sub
where row_num = 1;
-
Không có bất kỳ thông tin nào khác, hàng nào đứng trước (đó là lỗi thiết kế để bắt đầu, hãy khắc phục sự cố!), bạn có thể cố gắng lưu những gì bạn có thể sử dụng nội bộ tuple ID
ctid
Các hàng sẽ theo thứ tự vật lý khi được chèn vào ban đầu, nhưng điều đó có thể thay đổi bất kỳ lúc nào với bất kỳ thao tác ghi vào bảng hoặc
VACUUM
hoặc các sự kiện khác.
Đây là biện pháp cuối cùng và nó sẽ phá vỡ. -
Truy vấn đã trình bày của bạn không hợp lệ về một số số lượng:thiếu tên cột trong CTE đầu tiên, thiếu tên bảng trong CTE thứ hai, ...
-
Bạn không cần CTE cho việc này.
Đơn giản hơn với DISTINCT ON
(cân nhắc đối với ctid
áp dụng tương tự):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;