一段时间内的最大平均值

zvokhttg  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(356)

我试图在mysql中的数据库表上运行一个查询。我试图计算出连续几秒钟内瓦特的最大平均值。例如,我有一个表(提供的图片),我想查询这个表,找出表中某个人连续60秒的最大平均瓦特。我附上一张表的图片,以便您可以看到数据结构。非常感谢您的帮助。
这是我试过的,但无法计算出连续的时间段。

select max(avg_watts)
from 
(
  SELECT AVG(watts) avg_watts FROM tblworkoutdata GROUP BY personid
) tmp

db表截图

nhaq1z21

nhaq1z211#

这不像看上去那么容易。假设您有以下数据:

minute   watts
1        100
59       200
60       300
70       300
80       500
120      100

这将提供以下连续60分钟的范围:

minute   avg watts
1-60     150
59-80    325
70-120   300

但为什么要用什么规则来寻找这些范围呢?我将使用以下算法:
对于表中的每分钟,找出仍在相同范围内的最大分钟数(1->60,59->80,60->80,70->120,80->120,120->120)。
从这些对中取每结束分钟的最小开始分钟数(1<-59,59<-80,70<-120)
然后
对于每个范围,找到平均瓦特
从这些贪婪中得到最大的回报
查询:

select max(avg_watts)
from
(
  select
    (
      select avg(watts)
      from tblworkoutdata data 
      where data.time between groups.t1 and groups.t2
    ) as avg_watts
  from
  (
    select min(t1) as t1, t2
    from
    (
      select
        time as t1,
        (
          select max(tbl2.time)
          from tblworkoutdata tbl2
          where tbl2.time between tbl1.time and tbl1.time + 59
        ) as t2
      from tblworkoutdata tbl1
    ) pairs
    group by t2
  ) groups
) averages;

rextester演示:http://rextester.com/ozt99379
当然,您可以将子查询从 SELECT 从句至 FROM 如果你更喜欢这个的话。
(每个人都很容易得到这个结果。只需将personid包含在各处,并根据它对结果进行分组。)

xtupzzrd

xtupzzrd2#

您需要使用包含日期时间的任何列将数据表连接到自身。比如:

SELECT MAX(avg_watts) FROM (
    SELECT i.date_time,
           AVG(i2.watts) AS avg_watts
    FROM tblworkoutdata i
    JOIN tblworkoutdata i2
         ON  i2.date_time >= i.date_time 
         AND i2.date_time <  DATE_ADD(i.date_time, INTERVAL 1 MINUTE)
    GROUP BY i.date_time 
)

相关问题