1

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

但是,我没有理解其中的一部分。此处输入代码提供的解决方案如下:

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 x什么?data y通常 FROM 后跟表名。但是,当问题仅涉及一个时,为什么列出 2 个表?有人可以解释这个解决方案是如何工作的吗?另外,我不明白这部分:HAVING SUM(SIGN(1-SIGN(y.val-x.val))).

4

1 回答 1

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与之比较的值,则最终结果将是 a 1。例如,假设yis3xis 5

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找到中间范围......

于 2012-01-28T06:16:49.747 回答