2017-05-29 6 views
0

postgresqlとrubyでの作業で、大きなデータベースをバッチで処理したいと思います。私はfind_eachを使用するように見えません。しかし、私は最大のIDを持つ最新のデータを処理する必要があります。制限とオフセットによるスコープとオーダーの使用

私の現在の試みはscore_okは、WHERE句でスコープです

score_ok.order(cmp_id: :desc).limit(X).offset(Y).pluck(:id) 

です。 私は制限なしで、その後、小テスト・データベース上でこれを試してみて、すなわち

score_ok.order(cmp_id: :desc).pluck(:id) 

オフセットした場合、私は

[372、362、363、361、366、367、368、369、370を参照してください。 371、364]私は

score_ok.order(cmp_id: :desc).limit(2).offset(0).pluck(:id) 

をすれば

は、今私は

[362, 361] 
を取得

と私は

score_ok.order(cmp_id: :desc).limit(2).offset(2).pluck(:id) 

を行う場合、私は

[362, 366] 

が、その後、私が欲しいです[372、362]と[363、361]を取得します。これはどうすればいいですか? limit(2).offset(2)をクエリの先頭に移動しようとしましたが、それは役に立ちません。

+1

開始時に 'created_at'によるこの順序付けは、誤解を招くことがあります。あなたは 'comp_id'の代わりにそれを使用していませんか? – potashin

+0

開発ログから、実行されている実際のSQLを貼り付けることができますか?私の推測では、生成されたSQLは予期せぬことをしており、実際に何が起きているのか理解するのに役立ちます。私が似たようなときは、通常、生のSQLを使います。 – stef

+0

potashin、私はcmp_idを使用しています(私は質問を編集しましたが)私がcreated_atと置き換えた場合、クエリは期待どおりに動作します。 cmp_idは日付型です。私は明日の未加工SQLを見ていきます。 – Obromios

答えて

0

mu is too short'sコメントは動作を説明しました。 cmp_idには重複した値があり、明らかに、毎回同じ方法で等しい値をソートする必要はありません。これを修正する1つの方法は、一貫性のある方法でネクタイを破るためにセカンダリキーを追加することです。