3

Im Wesentlichen möchte ich den n-ten letzten Datensatz für jeden eindeutigen Namen erhalten.Wie bekomme ich den n-ten Datensatz für jeden eindeutigen Namen in einer Tabelle in Schienen?

Also, wenn ich habe eine Tabelle, die für die zweite Aufzeichnung jedes eindeutigen Namen abzufragen (n = 2) Ich möchte, um die Datensätze erhalten

so etwas wie

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

Und ich wollte sieht

name field1 
    a  4 
    c  0 
    b  3 

Gibt es eine Möglichkeit, dies in einer Abfrage zu tun. Oder muss ich für jeden eindeutigen Namen einmal abfragen?

Ich habe versucht, die Gruppenfunktion zu verwenden, aber konnte nicht etwas anderes als den letzten Datensatz für jede Gruppe zurückgeben.

Antwort

2

Sie order können Ihre Einträge durch ihre name Attribut bestellt zu bekommen:

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

Dann pluck verwenden nur die name und field1 Attribut zu erhalten:

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

, die mit Ihnen zusammenarbeiten, über können Ihr Ergebnis als Hash und verwenden Sie group_by, um sie nach ihrem ersten Element zu gruppieren:

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

Und dann Karte verwenden, um den zweiten Array-Wert für jeden Schlüsselwert in dem Haupt-Hash zu erhalten:

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

So könnte man versuchen, mit:

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