slno
がない場合 テーブルに、どの行が最初に挿入されたかについての信頼できる情報がありません。テーブルには自然な順序はありません。行の物理的な順序はいつでも変更できます(更新またはVACUUM
を使用)。 など)
あなたはできた 信頼できないを使用する トリック:内部のctid
による順序付け 。
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;
-
他の情報がない場合、どの行が最初に来たか(設計エラー) まず、修正してください!)、内部のタプルID
ctid
行は最初に挿入されたときに物理的な順序になりますが、テーブルまたは
VACUUM
への書き込み操作によっていつでも変更される可能性があります または他のイベント。
これは最後の手段の尺度であり、 休憩。 -
提示されたクエリは、いくつかの点で無効でした:1番目のCTEに列名がない、2番目のCTEにテーブル名がない、...
-
これにはCTEは必要ありません。
DISTINCT ON
で簡単に (ctid
に関する考慮事項 同じことを適用してください):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;