查找不同日期时间范围内的平均值

时间:2020-08-17 10:49:28

标签: mysql

我有一个数据库表results,其中有许多列,它显示了每分钟已计入多少个目标的运行计数。

例如

f_total_ftg    # full time goals
f_total_htg    # half time goals
f_total_1mg    # 1 minute goals

数据库中的每个插入都有一个列f_datetime,这是关联的时间戳。

我正在尝试获取每个目标列的平均值,然后取总体平均和最近2周的平均值并除以2。

示例:

f_avg_total_ftg_overall = 3.12
f_avg_total_ftg_last_2_weeks = 2.42

f_avg_ftg = (f_avg_total_ftg_overall + f_avg_total_ftg_last_2_weeks) / 2

我当前的解决方案是将每一列整体/过去2周分开,在我的python代码中返回一个字典,在其中进行结束计算,但这在我认为的一个查询中应该可行。

我目前拥有的是

SELECT AVG((SELECT AVG(f_total_ftg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS ft_x,
         AVG((SELECT AVG(f_total_ftg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS ft_y,
         
         AVG((SELECT AVG(f_total_1mg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS 1m_x,
         AVG((SELECT AVG(f_total_1mg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS 1m_y,   

         AVG((SELECT AVG(f_total_htg) as x FROM results WHERE f_datetime < '2020-07-01 01:30:00')) AS ht_total,
         AVG((SELECT AVG(f_total_htg) as x FROM results WHERE f_datetime between '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00')) AS ht_last14d
         
 FROM results

如何简化呢?

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合来简化查询,如下所示:

SELECT 
  AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_ftg END) AS ft_x,
  AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_ftg END) AS ft_y,
  AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_1mg END) AS 1m_x,
  AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_1mg END) AS 1m_y,
  AVG(CASE WHEN f_datetime < '2020-07-01 01:30:00' THEN f_total_htg END) AS ht_total,
  AVG(CASE WHEN f_datetime BETWEEN '2020-07-01 01:30:00' - INTERVAL 13 DAY AND '2020-07-01 01:30:00' THEN f_total_htg END) AS ht_last14d
FROM results

此外,查询可以进一步简化为:

SELECT 
  AVG(f_total_ftg) AS ft_x,
  AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_ftg END) AS ft_y,
  AVG(f_total_1mg) AS 1m_x,
  AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_1mg END) AS 1m_y,
  AVG(f_total_htg) AS ht_total,
  AVG(CASE WHEN f_datetime >= '2020-07-01 01:30:00' - INTERVAL 13 DAY THEN f_total_htg END) AS ht_last14d
FROM results
WHERE f_datetime <= '2020-07-01 01:30:00'

如果您在=表达式的不等式<= '2020-07-01 01:30:00'中包括了CASE

现在您可以从中进行选择并进行计算:

SELECT ft_x, ft_Y, 1m_x, 1m_y, ht_total, ht_last14d, 
       (ht_total + ht_last14d) / 2,
       ...........................
FROM (
  <the query here>
) t

我不确定(ht_total + ht_last14d) / 2是否是您所需要的,但我认为您已经明白了。

相关问题