Postgresql(Rails 3)合并列上的行(同一个表)

时间:2011-05-30 20:44:47

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

首先,我一直在使用mysql,现在正在升级到postgresql。 sql语法更严格,一些行为不同,因此我的问题。

我一直在寻找如何在表格中合并postgresql查询中的行,例如

id      | name        |   amount
0       | foo         | 12
1       | bar         | 10
2       | bar         | 13
3       | foo         | 20

并获取

name        |   amount
foo         | 32
bar         | 23

我找到的最近的是Merge duplicate records into 1 records with the same table and table fields

sql返回'name'的重复项:

 scope :tallied, lambda { group(:name, :amount).select("charges.name AS name,
                              SUM(charges.amount) AS amount,
                              COUNT(*) AS tally").order("name, amount desc") }


我需要的是

 scope :tallied, lambda { group(:name, :amount).select("DISTINCT ON(charges.name) charges.name AS name,
                              SUM(charges.amount) AS amount,
                              COUNT(*) AS tally").order("name, amount desc") }

除了返回给定名称的第一行,而不是返回具有给定名称的所有行的mash(添加的数量)

在mysql中,将.group(:name)(不需要初始组)附加到select将按预期工作。

这似乎是一项日常工作,应该很容易。这样做的简单方法是什么?请指出正确的道路。

P.S。我想在这里学习(其他人也是这样),不要只是扔掉我的脸,请解释一下。

1 个答案:

答案 0 :(得分:1)

我不知道RoR在后台做了什么,但我猜测group(:name, :amount)将运行按名称,数量分组的查询。您正在寻找的是group by name

select name, sum(amount) as amount, count(*) as tally
from charges
group by name

如果您将amount附加到group by子句,则查询将执行此操作 - 即count(*)将返回每个金额出现在每个名称的次数,以及{{ 1}}将返回该数量乘以该数量。