查找表中有另一行具有相反值的行

时间:2016-02-15 23:34:53

标签: ruby-on-rails postgresql ruby-on-rails-4

我试图找到解决问题的有效方法:

我需要查找表中的所有行,其中有另一行具有相反的列值。

例如,我有列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功能可以帮助解决此问题?

4 个答案:

答案 0 :(得分:0)

使用以下查询:

SELECT DISTINCT t1.* 
  FROM transactions t1 
  INNER JOIN transactions t2 ON t1.amount = t2.amount * -1;

答案 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
    );

答案 2 :(得分:0)

考虑存储绝对值索引列,然后查询正值。 Postgres具有绝对值功能;但我认为ActiveRecord的优点在于Arel抽象出了SQL。如果稍后更改,数据库特定的SQL可能会很痛苦。

答案 3 :(得分:0)

有一种名为abs的类型,无论symobol如何都会返回。从我的示例data是表名

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

这是样本测试表

enter image description here

这是输出

enter image description here