Таблица 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');
Спасибо!