sql >> データベース >  >> RDS >> PostgreSQL

ウィンドウ関数の決定論的ソート順

    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;
    • 他の情報がない場合、どの行が最初に来たか(設計エラー) まず、修正してください!)、内部のタプルIDctid

      行は最初に挿入されたときに物理的な順序になりますが、テーブルまたは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;
    



    1. postgresql8.3でタイムスタンプのタイムゾーンを知る方法

    2. データモデル

    3. MySQLがcmdで接続されていません

    4. mysqlから2番目に新しい行を取得する方法は?