在SQL中计算2,3四分位数平均值

mun*_*nch 13 mysql sql stored-procedures stored-functions

我想在SQL(MySQL)中编写一个存储过程来计算第二和第三四分位数的平均值.

换句话说,我有记录用于测量URL加载所需的时间.记录是(id,url,time),它们是每个URL的许多度量.我要做的是为每个URL删除最低和最高25%(即较低和较高四分位数)并计算剩余25%-75%加载时间的平均值.并将其存储到另一个表中.

我在MS SQL中看到了一些这样的例子,看起来相对简单.但我必须使用MySQL:

  • LIMIT子句不支持百分比(没有类似选择前25%)
  • LIMIT子句不支持其参数为变量(仅限常量)
  • 函数不支持动态SQL(例如PREPARE和EXECUTE)

我到这里得到了:

create procedure G(
  IN val VARCHAR(10)
)
Begin
  select @cnt:=count(*) from test where a=val;
  select  @of:= @cnt /4;
  SELECT @len:= @cnt/2; 
  Prepare stmt from 'select * from test where a="a" LIMIT ?,?';
  execute stmt using @of, @len;
END;
Run Code Online (Sandbox Code Playgroud)

我可以用PHP编写它,但在SQL中考虑它会有更好的整体性能.我非常感谢你的帮助.

Xae*_*ess 3

查看@Richard aka cyberkiwi 在这个问题中的回答和评论:

Select *
from
(
    SELECT tbl.*, @counter := @counter +1 counter
    FROM (select @counter:=0) initvar, tbl
    ORDER BY ordcolumn
) X
where counter >= (25/100 * @counter) and counter <= (75/100 * @counter);
ORDER BY ordcolumn
Run Code Online (Sandbox Code Playgroud)