AVG的最后三个条目按日期

时间:2017-04-18 03:44:28

标签: php mysql sql

Table

我有下表 我的目标是取平均列perDem,perGop,perInd但只有最后三个基于当天。如何编写这样的查询我试图使用order by,group by但无法实现结果。我需要每列的平均值,但只需要基于当天的最后三个条目。所以对于Alabama来说,例如平均perDem,perGop,PerInd,但只有三行,如果按天排序则是最后一行。  这就是我到目前为止所做的事情,但我需要根据为该特定州提交的日期,采取最后三个的平均值。

select polls.state,evotes,avg(perDem),avg(perGOP),avg(perInd)
             from polls,electoral
             where electoral.state=polls.state
             group by electoral.state,polls.state";

2 个答案:

答案 0 :(得分:0)

请尝试以下方法......

set @rowNum := 0;
set @state := '';

SELECT state,
       AVG( perDem ) AS avgPerDem,
       AVG( perGOP ) AS avgPerGOP,
       AVG( perInd ) AS avgPerInd
FROM
(
    SELECT day AS day,
           state AS state,
           perDem AS perDem,
           perGOP AS perGOP,
           perInd AS perInd,
           @rowNum := if ( @state = state,
                           @rowNum + 1,
                           1 ) AS rowNum,
           @state := state AS valueHolder
    FROM polls
    ORDER BY state,
             day DESC
) rowNumGenerator
WHERE rowNum <= 3
GROUP BY state
ORDER BY state;

此处内部查询返回对内容进行排序的排序按polls按字母顺序对state的内容进行排序,对于每个状态,它进一步按day从最大到最小排序行。

完成此操作后,它会返回感兴趣的字段(daystateperDemperGOPperInd)以及行号它根据以下模式生成...

在遇到新状态时,它会在第一行中为行1

该状态的每个后续行都将获得下一个可用的行号。

这有效地为有序列表中每个记录的位置指定一个数字,相对于state的第一个记录。

外部查询仅选择那些位置/行号将其置于其state前三位的行。

然后,生成的数据集的记录按state分组。请注意,外部SELECT语句不知道内部per语句使用的分组,并且不能安全地假设它。因此,除非另有指示,否则它将假定没有分组。

然后计算每个州的Severity: Notice Message: Use of undefined constant PASSWORD_DEFAULT - assumed 'PASSWORD_DEFAULT' Filename: config/aauth.php Line Number: 136 字段的平均值,并将所有指定的字段返回给用户。

如果您有任何问题或意见,请随时发表评论。

答案 1 :(得分:0)

一种可能的方法是利用MySQL用户定义的变量来模拟其他数据库中可用的分析/窗口函数。

SELECT v.state
     , e.evotes
     , AVG(IF(v.n<=3,v.perDem,NULL)) AS perDem_avg_last_3_day
     , AVG(IF(v.n<=3,v.perGOP,NULL)) AS perGOP_avg_last_3_day
     , AVG(IF(v.n<=3,v.perInd,NULL)) AS perInd_avg_last_3_day
  FROM ( SELECT @i := IF(p.state = @p_state,@i+1,1) AS n
              , @p_state := p.state AS `state`
              , p.perDem
              , p.perGOP
              , p.perInd
           FROM polls p
          CROSS
           JOIN ( SELECT @p_state = '', @i := 0 ) i
          ORDER
             BY p.state DESC
              , p.day DESC
       ) v
  JOIN electoral e
    ON e.state = v.state
 GROUP BY v.state, e.evotes
 ORDER BY v.state

注意:MySQL Reference手册专门警告这种用户定义变量的使用方式;但是通过MySQL 5.6,我们通过精心构造的SELECT语句来观察组成行为。)

从性能角度来看,这种方法对于大型集合来说并不是最理想的(实现内联视图,并且可能需要“使用filesort”操作。)

相关问题