【问题标题】:Average of values between current row and min date in mysqlmysql中当前行和最小日期之间的平均值
【发布时间】:2014-11-06 23:46:12
【问题描述】:

我有一个包含两列日期和值的表格。表格总是按日期降序排列。

现在我需要当前行日期和最小日期之间的平均值。

例如

日期        值        平均
2000 年 1 月 31 日             2400
1 月 30 日     4000        2500
1 月 29 日     3000        2000
1 月 28 日     1000        1500
2000 年 1 月 27 日             2000

值的平均范围应在行日期和最小日期之间,例如对于 1 月 28 日,它应该只计算 28 日和 27 日的值,而对于 30 日,它应该只计算 1 月 30 日到 1 月 27 日的值。

任何人都可以帮助使用mysql代码。我对此一无所知。

【问题讨论】:

  • @JohnRuddell 他想要基于给定日期x 和每隔一个日期<= x 的平均值。例如 1 月 29 日,3000+1000+2000/3 = 2000
  • 表格未排序。

标签: mysql sql average


【解决方案1】:

下面的(SQL Fiddle)怎么样:

SELECT m.Date, m.Value, AVG(m2.Value) AS Avg
FROM MyTable m
LEFT JOIN MyTable m2 ON m.Date >= m2.Date
GROUP BY m.Date
ORDER BY m.Date DESC

如果您的 Date 字段是 DateDatetime 类型,则上述查询将起作用。但是,如果您的 Date 字段是一个字符串,那么您将不会得到您想要的结果。

如果您的 Date 字段是一个字符串并且已经按降序排序,那么您可以使用以下 (SQL Fiddle):

SELECT m.Date, m.Value, AVG(m2.sValue) AS Avg
FROM
(
  SELECT s.Date, s.Value, @i:=@i+1 AS rn
  FROM MyTable s
  ,(SELECT @i:=0) AS foo
) m
LEFT JOIN
(
  SELECT s.Date AS sDate, s.Value AS sValue, @j:=@j+1 AS srn
  FROM MyTable s
  ,(SELECT @j:=0) AS foo
) m2 ON m.rn <= m2.srn
GROUP BY m.Date
ORDER BY m.Date DESC;

【讨论】:

  • SELECT AVG(value) FROM TABLE WHERE date &lt;= X 会做的时候为什么这么复杂?我在这里看到的唯一问题是,一旦您开始有不同的年份,将日期格式存储为 d-m 将不起作用。
  • @Aziz Saleh,我把答案改成了更复杂的东西。
  • 如果Date 是唯一的,则第一个查询很好。第二个不保证有效。它会给出不确定的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2016-05-15
相关资源
最近更新 更多