【问题标题】:i need to find out the average of the amount for consecutive way我需要找出连续方式的平均金额
【发布时间】:2019-09-14 14:12:47
【问题描述】:

问题是返回如下查询 如下方式返回结果!

101 saurav  2019-09-15  100.00     100.0000
102 mahesh  2019-09-14  200.00     150.0000
103 moja    2019-09-16  300.00     200.0000

对于第一行,与 avg(Amount) 相同的金额将返回 100 对于第二行,它应该计算 sum(100+200)/2 = 150 作为平均值 第三行的返回值类似于 sum (100 +200+300)/3 = 200ā 作为平均值

【问题讨论】:

  • 101 saurav 2019-09-15 100.00 100.0000
  • 102 mahesh 2019-09-14 200.00 150.0000 103 moja 2019-09-16 300.00 200.0000
  • 列名是什么?你的 MySQL 版本是多少?
  • 如果你有一百万行,你想平均超过一百万行吗? - 这在统计上没有用。

标签: mysql sql


【解决方案1】:

使用表的自连接:

select
  t.id, t.name, t.date, t.amount,
  avg(tt.amount) averageamount
from tablename t left join tablename tt
on tt.id <= t.id
group by t.id, t.name, t.date, t.amount

我为您的列使用了这些名称:id, name, date, amount
此代码适用于任何版本的 MySql。
请参阅demo
结果:

| id  | name   | date                | amount | averageamount |
| --- | ------ | ------------------- | ------ | ------------- |
| 101 | saurav | 2019-09-15 00:00:00 | 100    | 100           |
| 102 | mahesh | 2019-09-14 00:00:00 | 200    | 150           |
| 103 | moja   | 2019-09-16 00:00:00 | 300    | 200           |

【讨论】:

    【解决方案2】:

    如果您运行的是 MySQL 8.0,则可以为此目的使用窗口函数,例如:

    假设如下表结构和数据:

    | id  | name   | day        | value |
    | --- | ------ | ---------- | ----- |
    | 101 | saurav | 2019-09-15 | 100   |
    | 102 | mahesh | 2019-09-14 | 200   |
    | 103 | moja   | 2019-09-16 | 300   |
    

    以下查询:

    SELECT 
        t.*,
        AVG(value) OVER(ORDER BY day) avg_value
    FROM mytable t;
    

    会给你以下结果:

    | id  | name   | day        | value | avg_value |
    | --- | ------ | ---------- | ----- | --------- |
    | 102 | mahesh | 2019-09-14 | 200   | 200       |
    | 101 | saurav | 2019-09-15 | 100   | 150       |
    | 103 | moja   | 2019-09-16 | 300   | 200       |
    

    Demo on DB Fiddle

    【讨论】:

    • 请注意,默认的窗口框架是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。这可能会导致this
    【解决方案3】:

    您可以使用变量来解决这个问题,但它可能会影响大量数据的性能。

    假设您的 4 列名为 id, name, date, score,您可以这样做:

    SET @count = 0;
    SET @sum = 0;
    
    SELECT *, (@sum:=@sum+score)/(@count:=@count+1) AS average 
    FROM table1
    ORDER BY id ASC
    

    你可以试试here

    【讨论】:

    • 为什么你认为这会比其他方法更有影响力?
    • 有影响力是指比其他方法更好?我没有,我已经投票了另一个答案;)
    • “影响”,我的意思是随便你。这是你的话。
    • 好吧,必须为每个返回的行计算变量和除法,这将使其比简单的选择慢。我不确定它与上述其他两种解决方案相比如何,但我的直觉和经验(我承认我可能错了)是它会比连接慢,例如。
    • FWIW,我的直觉告诉我你的方法更快。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2020-10-15
    • 2016-12-05
    • 2012-06-30
    • 2019-09-23
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多