3

基本上我想獲得每個不同名稱的第n個最後記錄。如何獲得軌道表中每個不同名稱的第n條記錄?

所以,如果我有一個表,看起來像

name field1 
a  1 
b  3 
a  4 
a  2 
c  1 
c  0 
b  3 
b  2 
c  1 

,我想查詢每一個不同名稱的第二個記錄(N = 2) 我想記錄

name field1 
    a  4 
    c  0 
    b  3 

有沒有辦法在一個查詢中做到這一點。或者我需要爲每個不同的名稱查詢一次?

我一直在嘗試使用組函數,但無法讓它返回除了每個組的最後一條記錄以外的任何內容。

回答

2

您可以使用order獲得通過他們的name屬性訂購的記錄:

# => [#<model:0x007f8293e61820 id: 1, name: "a", field1: "1"..., 
... 
#<model:0x007f8293e60150 id: 9, name: "c", field1: "1"...] 

然後使用pluck只得到了namefield1屬性:

# => [["a", "1"], ["a", "4"], ["a", "2"], ["b", "3"], ["b", "3"], ["b", "2"], ["c", "1"], ["c", "0"], ["c", "1"]] 

有了可以工作在您的結果作爲散列並使用group_by按它們的第一個元素對它們進行分組:

# => {"a"=>[["a", "1"], ["a", "4"], ["a", "2"]], "b"=>[["b", "3"], ["b", "3"], ["b", "2"]], "c"=>[["c", "1"], ["c", "0"], ["c", "1"]]} 

然後使用地圖,讓第二陣列值主散列每個鍵值:

Model 
    .order(:name) 
    .pluck(:name, :field1) 
    .group_by(&:first) 
    .map{|_,v| v[1]} 
    .to_h 
# => {"a"=>"4", "b"=>"3", "c"=>"0"} 

# => [["a", "4"], ["b", "3"], ["c", "0"]] 

所以,你可以嘗試用

相關問題