Как найти среднюю заданную частоту чисел? - PullRequest
0 голосов
/ 21 сентября 2018

Таблица Numbers содержит значение числа и его частоту.

+----------+-------------+
|  Number  |  Frequency  |
+----------+-------------|
|  0       |  7          |
|  1       |  1          |
|  2       |  3          |
|  3       |  1          |
+----------+-------------+

В этой таблице числа 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3, поэтому медиана равна (0 + 0) / 2 = 0. Как найти медиану (показанный выход) по заданной частоте чисел?

+--------+
| median |
+--------|
| 0.0000 |
+--------+

Я нашел следующее решение здесь .Однако я не могу этого понять.Может кто-нибудь объяснить решение и / или опубликовать другое решение с объяснением?

SELECT AVG(n.Number) AS median 
FROM Numbers n LEFT JOIN
(
SELECT Number, @prev := @count AS prevNumber, (@count := @count + Frequency) AS countNumber
FROM Numbers, 
(SELECT @count := 0, @prev := 0, @total := (SELECT SUM(Frequency) FROM Numbers)) temp ORDER BY Number
) n2
ON n.Number = n2.Number
WHERE 
(prevNumber < floor((@total+1)/2) AND countNumber >= floor((@total+1)/2))
OR
(prevNumber < floor((@total+2)/2) AND countNumber >= floor((@total+2)/2))

Вот сценарий SQL для воспроизводимости:

CREATE TABLE `Numbers` (
  `Number` INT NULL,
  `Frequency` INT NULL);

INSERT INTO `Numbers` (`Number`, `Frequency`) VALUES ('0', '7');
INSERT INTO `Numbers` (`Number`, `Frequency`) VALUES ('1', '1');
INSERT INTO `Numbers` (`Number`, `Frequency`) VALUES ('2', '3');
INSERT INTO `Numbers` (`Number`, `Frequency`) VALUES ('3', '1');

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете использовать накопленную сумму, а затем взять промежуточную точку.Я думаю, что логика выглядит так:

select avg(number)
from (select t.*, (@rf := @rf + frequency) as running_frequency
      from (select t.* from t order by number) t cross join
           (select @rf := 0) params
     ) t
where running_frequency - frequency >= ceil(@rf / 2) and
      running_frequency <= ceil((@rf + 1) / 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...