解释以前回答的帖子的解决方案:在MySQL中查找中位数

时间:2012-01-28 05:44:20

标签: mysql median

我需要计算MySQL的中值。我看到了解决方案here

但是,我不明白它的一部分。提供的解决方案输入代码如下:

SELECT x.val from data x, data y
GROUP BY x.val
HAVING SUM(SIGN(1-SIGN(y.val-x.val))) = (COUNT(*)+1)/2

在原始问题的背景下,data xdata y是什么?通常FROM后跟表名。但是,当问题仅涉及一个时,为什么会列出2个表呢?有人可以解释这个解决方案的工作原另外,我不明白这一部分:HAVING SUM(SIGN(1-SIGN(y.val-x.val)))

1 个答案:

答案 0 :(得分:2)

  

原始问题的上下文中的数据x和数据y是什么?   通常FROM后跟表名。但是,为什么有2张桌子呢?   当问题只涉及一个时列出?

在原始问题中,data x, data y将表连接到自身,创建了一个笛卡尔积。原始表有7行,通过将每一行连接到每一行,结果产品为49行。

  

另外,我不理解这一部分:HAVING SUM(SIGN(1-SIGN(y.val-x.val)))

基本上,此函数为每个值确定有多少值小于被检查的值。然后它将此总数与计数的一半+ 1 ...进行比较,然后选择该值作为中位数。

它通过从比较值(x.val)中减去值(y.val)来实现。然后,它使用SIGN函数将结果转换为-101。然后它减去这个值,然后再次取SIGN。因此,如果y.val值小于要与之比较的x.val值,则最终结果为1。例如,假设y3x5

3 - 5 = -2
SIGN(-2) = -1
1 - (-1) = 2
SIGN(2) = 1

如果y5,而x3,则最终结果为0

5 - 3 = 2
SIGN(2) = 1
1 - 1 = 0
SIGN(0) = 0

总结这些比较的结果给出了一个数字,表示在我们检查的值之前有多少值。然后,它会将此SUMCOUNT(*) + 1 / 2进行比较,以找到中间范围......