如何在MySQL中找到列的中间值?


10

我只能想象使用两个数据库查询来执行此操作。第一个查找数据库中的行数,第二个查找ORDER BY我感兴趣的列上的一个,LIMIT X, 1其中X是行数的一半。

是否有一种简单的方法可以只执行一个查询?

现在,我在计算中使用了平均值,但我认为平均值会更好。值没有上限,并且从下方以0为界。


编辑:是的,我的意思是说“中位数”,但脑部有误并搜索了“均值”。我现在在stackoverflow找到了答案


在阅读了meta一段时间之后,似乎有一个分歧可以解决这个问题,应该在这里还是在SO。我知道这可能不是忍者级别的查询,但这让我感到困惑,而且我工作的公司没有DBA(总共6个人)。
JIStone

Answers:


6

有相当多的讨论,在这里从一个MySQL表计算中值。只需在页面上搜索“中位数”即可。

顺便说一句,让我感到惊讶的是,没有内置函数可以执行此操作。中位数通常比平均更能说明集中趋势。Access / VBA在其功能列表中具有相同的漏洞。


我同意。当处理大型查询时,多余的行只会使整个事情变得更加繁琐且难以调试/维护。
JIStone 2011年

2

我还没有在任何地方都能在单个查询中获得中位数的解决方案。我不在乎临时表,但是如果不需要的话,太好了!这是我想出的:

SELECT AVG(profit) median, nofitems FROM(
  SELECT x.profit, SUM(SIGN(1.0-SIGN(y.profit-x.profit))) diff, count(*) nofitems, floor(count(*)+1/2)
  FROM brand_prof x, brand_prof y
  GROUP BY x.profit
  HAVING SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = floor((COUNT(*)+1)/2)
      OR SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = ceiling((COUNT(*)+1)/2)
) x;

我对此进行了均匀测试,并得到了正确的答案。brand_prof只是两列:brand_name和Profit(十进制值)。如果这是整数值,则可能需要强制转换“ ceiling((CAST COUNT(*)AS DECIMAL)...” ...),这比我已经测试的要多。使用笛卡尔积并将符号和关联起来的好主意是不幸的是,我已经忘记了作者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.