【问题标题】:how to get the sum of the rows before the current row in MYSQL? [duplicate]如何获取MYSQL中当前行之前的行总和? [复制]
【发布时间】:2012-01-12 19:03:40
【问题描述】:

可能重复:
MySQL query that computes partial sums

好的,这个问题根本不清楚,所以例子是: 我有一张这样的桌子:

id     amount

1       1000
2       2500
3       5000

我需要从中选择以下数据:

id     oamount     total

1       1000      1000
2       2500      3500
3       5000      8500

我试过了,但它不正确:

    select *,sum(oamount) from `table` 
group by id;

我想不通

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我已经回答了一个非常相似的问题,他们试图获取每天开始/结束的现金流余额...Found here

    您的将非常相似...以您想要的最终顺序预查询数据(即:起始 ID 将是结果集中的第一个),然后使用 MySQL 变量应用您想要的内容

    select
          PreAgg.ID,
          PreAgg.Amount,
          @PrevBal := @PrevBal + PreAgg.Amount as Total
       from 
          ( select
                  YT.id,
                  YT.amount
               from
                  YourTable YT
               order by
                  YT.id ) as PreAgg,
          ( select @PrevBal := 0.00 ) as SqlVars
    

    我实际上已将预聚合保留为查询...以防您想实际进行一些聚合,例如基于每天的交易,或应用其他一些 WHERE 子句。这样可以灵活地确保在开始您的@PrevBal 累积之前准备好您的最终输出订单。

    【讨论】:

    • 我在考虑一些带有游标和循环的 PL/SQL,但这很酷 ;)
    【解决方案2】:

    尝试以下方法:

    select 
      *,
      (select sum(oamount) from `table` WHERE id <= t.Id) AS total
    from `table` AS t
    

    【讨论】:

    • 虽然它可以工作,但取决于数据的大小,可能会变得很痛苦,5 条记录必须在子查询中计算 5 + 4 + 3 + 2 + 1 个实例......再试一次有 1000 个条目...
    • @DRapp 是的,性能杀手。这是一个fast'n'simple的决定。性能效率会略有不同
    【解决方案3】:
     SELECT id,amount,@total := @total + amount 
     FROM `table`, (SELECT @total := 0) as dummy 
     ORDER BY id;
    

    请注意,这在使用 GROUP BY 子句/聚合时不起作用。

    【讨论】:

      【解决方案4】:

      试试这个:

      SET @res:=0;
      SELECT
         t.a,
         t.b,
         (@res := @res + t.b) AS summ
      FROM
      (SELECT first AS a, second AS b FROM table GROUP BY a ORDER BY a) AS t
      

      【讨论】:

        猜你喜欢
        • 2015-10-22
        • 2011-11-18
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 2012-09-15
        • 2021-07-12
        相关资源
        最近更新 更多