mysql - SQL游标确定中值

标签 mysql sql cursor

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

    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 ;

我似乎找不到任何与我想要实现的目标类似的文档,任何帮助将不胜感激。

最佳答案

我没有您的存储过程问题的答案,但请注意,我们实际上可以使用 session 变量来模拟行号,相当轻松地从 MySQL 中的表中找到中位数:

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 子句中的丑陋之处与具有偶数 条记录的表的边缘情况有关。在这种情况下,从技术上讲,不存在单个中位数记录,因此我报告了位于两侧中位数附近的两条记录的平均值

关于mysql - SQL游标确定中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51779269/

相关文章:

sql - PostgreSQL 非标准选择(分组)

c# - Entity Framework 4.1 - 代码优先 : many-to-many relationship

android-studio - 在 Android Studio 中关闭白色光标

android - 表记录更改时更新sqlite游标?

python - 返回字典时的光标并打印键在哪里

php - 拉维尔 : saving date to MySQL

php - 什么是更好的额外查询或数据库中的额外列?

sql - Rails HABTM 查询——带有所有标签的文章

java - 线程中的异常 "main"java.sql.SQLException : No suitable driver found for

mysql - 为什么Solr导入后会删除文档