2016-02-15 58 views
0

我試着去找到解決問題的有效途徑:找到行,其中有另一行與表中的相對值

我需要找到一個表中的所有行那裏是另一行以相反的列值。

比如我有列idamount

| id | amount | 
|----|--------| 
| 1 | 1  | 
| 2 | -1  | 
| 3 | 2  | 
| 4 | -2  | 
| 5 | 3  | 
| 6 | 4  | 
| 7 | 5  | 
| 8 | 6  | 

交易查詢應返回只有第4行:

| id | amount | 
|----|--------| 
| 1 | 1  | 
| 2 | -1  | 
| 3 | 2  | 
| 4 | -2  | 

我目前的解決方案是非常有效的,因爲我經歷1000年的交易:

transactions.find_each do |transaction| 
    unless transactions.where("amount = #{transaction.amount * -1}").count > 0 
    transactions = transactions.where.not(amount: transaction.amount).order("@ amount DESC") 
    end 
end 
transactions 

是否有內置的RailsPostgresql函數可以幫助解決這個問題?

+0

我是一個新手。但我不明白你爲什麼選擇了4條第一條線。你可以解釋嗎 ? – Maxence

+0

@Maxence這4行中的每一行在表中都有另一行,並有相反的值。例如,「-1」與「1」相反。 – Deekor

+0

你不需要明確地配對它們嗎?只是讓他們成批? (可以說10行的值爲1,45行的值爲-1,你想要55行全部一起?) – Maxence

回答

0

使用下面的查詢:

SELECT DISTINCT t1.* 
    FROM transactions t1 
    INNER JOIN transactions t2 ON t1.amount = t2.amount * -1; 
0
SELECT * FROM the_table t 
WHERE EXISTS (
    SELECT * FROM the_table x 
    WHERE x.amount = -1*t.amount 
    -- AND x.amount > t.amount 
    ); 
0

考慮存儲索引列,然後查詢正值的絕對值。 Postgres具有絕對的價值功能;但我認爲ActiveRecord的優點在於Arel將SQL抽象出來。如果稍後更改,數據庫特定的SQL可能會很痛苦。

0

有一種叫做abs的類型,不管symobol如何都會返回。從我的例子data是表名

SELECT id,amount FROM DATA WHERE id = ABS(amount) 

這是樣品測試表

enter image description here

這裏是輸出

enter image description here

+0

這甚至不回答我的題。 – Deekor

相關問題