让我们创建一个名为numbers的示例表
此答案特定于MySQL数据库
在PostgresSql中,可以简单地使用per_cont函数
CREATE TABLE numbers(
num INT,
frequency INT
);
在数字表中插入数值
INSERT INTO numbers VALUES
(0,7),
(1,1),
(2,3),
(3,1),
(9,1),
(1,1),
(2,3),
(3,1),
(9,1);
WITH RECURSIVE num_frequency (num,frequency, i) AS
(
SELECT num,frequency,1
FROM numbers
UNION ALL
SELECT num,frequency,i+1
FROM num_frequency
WHERE num_frequency.i < num_frequency.frequency
)
select *
(max(case when numbers=lower_limit then num else null end)/2
+max(case when numbers=upper_limit then num else null end)/2) as median
from (
select *,total_number%2,
case
when total_number%2=0 then total_number/2
else (total_number+1)/2 end as lower_limit,
case
when total_number%2=0 then total_number/2+1
else (total_number+1)/2
end as upper_limit
from (
select *,max(numbers) over() as total_number from (
select num,row_number() over (order by num)
as numbers from num_frequency
)b
)b
)b