2017-05-29 52 views
0

在rails上使用postgresql和ruby,我想批量處理大型數據庫。我似乎無法使用find_each,因爲它使用最小的id向上。但我需要處理最新的數據,其中最大的ID。使用範圍和訂單的極限和偏移

我現在的嘗試是

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

其中score_ok是一個範圍與where子句。 如果我試試這個小測試數據庫上,然後用無極限,即偏移

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是日期類型。 stef,明天我會看看原始的sql。 – Obromios

回答

0

mu is too short's評論解釋了行爲。 cmp_id具有重複的值,顯然數據庫不需要每次都以相同的方式對相同的值進行排序。解決這個問題的一個方法是添加一個輔助鍵來以一致的方式打破關係。