我有下表 我的目标是取平均列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";
答案 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
从最大到最小排序行。
完成此操作后,它会返回感兴趣的字段(day
,state
,perDem
,perGOP
和perInd
)以及行号它根据以下模式生成...
在遇到新状态时,它会在第一行中为行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”操作。)