2015-12-29 29 views
2

實施例的數據:採取從由有源記錄分組只有一個值 - Ruby on Rails的

我有表訂單:

[order_id: 007, state: completed] 
[order_id: 123, state: completed] 
[order_id: 007, state: failed] 
[order_id: 321, state: failed] 
[order_id: 111, state: failed] 
[order_id: 111, state: failed] 

預期輸出:

[order_id: 007, state: completed] 
[order_id: 123, state: completed] 
[order_id: 321, state: failed] 
[order_id: 111, state: failed] 

我有許多值'訂單'具有相同的order_id但狀態不同。我想要收到的是沒有那些'失敗'狀態的訂單列表,如果表'訂單'中的另一個訂單具有相同的order_id並且狀態不同於'失敗'。

我需要這樣的東西:

Order.all.group(:state).take_only_first_value_if("COUNT(*) > 1") 
+0

這可能有助於https://開頭計算器。 com/questions/3800551/select-first-in-each-group-by-group –

回答

1

使用PostgreSQL(snippet):

Order.order("order_id, state = 'failed'").select("DISTINCT ON(order_id) *") 
+0

好的。它返回我的訂單的唯一值但是...它仍然是隨機的。如果有多個order_id相同的訂單,我會收到帶有此id的隨機訂單。我想要的是 - 如果有相同order_id的許多訂單,並且其中一個'狀態'與'失敗'不同,請將該訂單返回給我。 DISTINCT會返回給我的uniq值,但是是隨機的。 我相信@Kristján發現我的答案在這裏: [LINK](https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) 但我仍然需要幫助翻譯這個SQL上的Ruby Active Record :( –

+0

使用postgres sql爲我工作。檢查:http://sqlfiddle.com/#!15/4af1c/1/0 – tokland

+0

很好!..它實際上做了這件事!我'已經犯了一些語法錯誤。「DISTINCT ON(xxx)」與「DISTINCT ON xxx」不一樣..非常感謝!:) –

0

你可以嘗試這樣的:

failed = Order.where(state: 'failed').pluck(:order_id) 
completed = Order.where(state: 'completed').pluck(:order_id) 

what_you_want = Order.where("order_id IN (#{failed}) AND order_id IN (#{completed})").distinct 
+0

我編輯它,可以你檢查它? – fabriciofreitag

+0

這樣做更有意義,雖然我不認爲這是OP所需要的。你也可以這樣做'where(order_id:failed&completed)'('Array#&'是十字路口)。 –

+0

不幸在你的解決方案(得到我的例子上面)順序order_id = 007會在'what_you_want'陣列兩次......它不是我正在尋找。 –