SQL 光标确定中值

SQL Cursor to determine median value

我正在尝试编写一个存储过程来从 table 中检索工资中位数,但我无法弄清楚如何从游标中检索数据。 目前我的代码是:

    DELIMITER //
CREATE PROCEDURE MedianSalary(OUT median INT)
BEGIN

DECLARE counter int(5) DEFAULT 0;
DECLARE set_size int(5) DEFAULT (SELECT count(*) from employee);
DECLARE median_index int(5) DEFAULT (SELECT floor(count/2));


DECLARE all_salaries CURSOR

FOR SELECT salary from employee,
OPEN all_salaries;

WHILE @counter != @median_index
BEGIN
 SET @counter = @counter + 1,
 FETCH NEXT from all_salaries,
END;

FETCH all_salaries INTO median;

CLOSE all_salaries;

END //
DELIMITER ;

我似乎找不到任何与我正在努力实现的目标类似的文档,我们将不胜感激。

我没有你的存储过程问题的答案,但请注意,我们实际上可以很容易地使用会话变量来模拟行号,从 MySQL 中的 table 中找到中位数:

SET @row_number = 0;
SET @row_count = (SELECT COUNT(*) FROM yourtable);

SELECT AVG(salary) AS median
FROM
(
    SELECT (@row_number:=@row_number + 1) AS rn, salary
    FROM yourTable
    ORDER BY salary
) t
WHERE
    (@row_count % 2 = 0 AND rn IN (@row_count / 2, (@row_count / 2) + 1) OR
     @row_count % 2 <> 0 AND rn = @row_count / 2);

Demo

请注意 WHERE 子句中的丑陋之处与您的 table 具有 偶数 条记录的边缘情况有关。在这种情况下,技术上没有单一的中值记录,因此我报告了两条记录的 mean,它们位于两边的中值附近。