Jika Anda tidak memiliki slno
di tabel Anda, maka Anda tidak memiliki informasi yang dapat dipercaya baris mana yang dimasukkan terlebih dahulu. Tidak ada urutan alami dalam tabel, urutan fisik baris dapat berubah kapan saja (dengan pembaruan apa pun, atau dengan VACUUM
, dll.)
Anda bisa gunakan tidak dapat diandalkan trik:pesan dengan ctid
internal .
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;
-
Jika tidak ada informasi lain, baris mana yang lebih dulu (yang merupakan kesalahan desain untuk memulai, perbaiki!), Anda dapat mencoba menyimpan apa yang Anda bisa menggunakan ID tupel
ctid
Baris akan berada dalam urutan fisik saat dimasukkan pada awalnya, tetapi itu dapat berubah kapan saja dengan operasi tulis apa pun ke tabel atau
VACUUM
atau acara lainnya.
Ini adalah langkah terakhir dan akan istirahat. -
Kueri yang Anda sajikan tidak valid dalam beberapa hal:nama kolom tidak ada di CTE pertama, nama tabel tidak ada di CTE ke-2, ...
-
Anda tidak memerlukan CTE untuk ini.
Lebih sederhana dengan DISTINCT ON
(pertimbangan untuk ctid
berlaku sama):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;