Объяснение решения для ранее отвеченного поста: поиск медианы в MySQL - PullRequest
1 голос
/ 28 января 2012

Мне нужно рассчитать медианное значение в 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 в контексте исходного вопроса?Обычно ОТ сопровождается именем таблицы.Но тогда почему две таблицы перечислены, когда вопрос касается только одной?Может кто-нибудь объяснить, как работает это решение?Кроме того, я не понял эту часть: HAVING SUM(SIGN(1-SIGN(y.val-x.val))).

1 Ответ

2 голосов
/ 28 января 2012

Что такое данные x и данные y в контексте исходного вопроса?Обычно ОТ сопровождается именем таблицы.Но тогда почему две таблицы перечислены, когда вопрос относится только к одной?

В исходном вопросе data x, data y соединяет таблицу с собой, создавая декартово произведение.Исходная таблица имела 7 строк, и, соединяя каждую строку с каждой другой строкой, получилось 49 строк.

Кроме того, я не понял эту часть: HAVING SUM(SIGN(1-SIGN(y.val-x.val))).

По сути, эта функция для каждого значения определяет, сколько значений меньше рассматриваемого значения.Затем он сравнивает эту сумму с половиной числа + 1 ... и затем выбирает это значение в качестве медианы.

Это происходит путем вычитания значения (x.val) из сравниваемого значения (y.val).Затем он использует функцию SIGN для преобразования результата в -1, 0 или 1.Затем он вычитает это значение, а затем снова принимает SIGN.Таким образом, если значение y.val меньше значения x.val, с которым оно сравнивается, конечный результат будет 1.Например, допустим, что y равно 3, а x равно 5.

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

Если y было 5, а x было 3 ..конечный результат будет 0:

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

Суммирование результатов этих сравнений дает нам число, которое указывает, сколько значений предшествует изучаемому нами значению.Затем он сравнивает это SUM с COUNT(*) + 1 / 2, чтобы найти средний диапазон ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...