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);
请注意 WHERE
子句中的丑陋之处与您的 table 具有 偶数 条记录的边缘情况有关。在这种情况下,技术上没有单一的中值记录,因此我报告了两条记录的 mean,它们位于两边的中值附近。
我正在尝试编写一个存储过程来从 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);
请注意 WHERE
子句中的丑陋之处与您的 table 具有 偶数 条记录的边缘情况有关。在这种情况下,技术上没有单一的中值记录,因此我报告了两条记录的 mean,它们位于两边的中值附近。