单个查询通过计算组总数的百分比来填充缺失列

时间:2015-11-30 20:06:44

标签: mysql sql

我有一个带有架构的mysql表,如下所示:

group    id    amount    fraction
1        1     3         
1        2     5
2        3     2
2        3     1

每一行都属于一个组。每行还存储一个名为amount的特定值。我想找到每行所有组amount的分数,因此表格如下所示:

AFTER

group    id    amount    fraction
1        1     3         .375
1        2     5         .625
2        3     2         66.67
2        3     1         33.33

要获取第1列的值,我总结第1组中的所有amount列。这将是3 + 5,即8。然后我将第1行中的amount除以小组总和,产生.375。我为他们所有人做了这件事。

我可以通过写这样的查询来做到这一点:

SELECT SUM(amount) GROUP BY group

然后遍历每个组,选择该组中的行,计算分数,并更新行。不幸的是,这意味着在初始查询之后,我将处理2个嵌套for循环,以及数百万个查询,这将花费很长时间给定数据集的大小。

我有一种微妙的感觉,有一种方法可以通过一个mysql查询更有效地做到这一点。如果任何人对如何使用单个查询执行此操作有任何想法,那就是我的问题。

1 个答案:

答案 0 :(得分:2)

您可以使用join和聚合:

在单个查询中执行此操作
select t.*, t.amount / tt.sumamount
from t join
     (select group, sum(amount) as sumamount
      from t
      group by group
     ) tt
     on t.group = tt.group;

编辑:

update非常相似:

update t join
       (select group, sum(amount) as sumamount
        from t
        group by group
       ) tt
       on t.group = tt.group
    set fraction = t.amount / tt.sumamount;