【问题标题】:MySQL function to calculate percentileMySQL函数计算百分位数
【发布时间】:2021-03-21 10:17:38
【问题描述】:

我正在尝试编写一个 mysql 函数来计算我的百分位数。 我的代码:

CREATE DEFINER=`root`@`localhost` FUNCTION `percentile`(tbl_name VARCHAR(255),col_name VARCHAR(255)) RETURNS double(10,2)
    READS SQL DATA
    DETERMINISTIC
BEGIN

RETURN CONCAT('SELECT `',col_name,'` FROM 
(SELECT t.*,  @row_num :=@row_num + 1 AS row_num FROM `',tbl_name,'` t, 
    (SELECT @row_num:=0) counter ORDER BY `',col_name,'`) 
temp WHERE temp.row_num = ROUND (0.75* @row_num);');
END

当我尝试调用它时,我得到了错误:

Error Code: 1265. Data truncated for column schema.percentile('table', 'column')

我无法找出错误的来源。有什么解决办法吗?

【问题讨论】:

  • 您的计算值是一个字符串(例如字符串“select ...”,而不是该查询的结果),将其作为 double(10,2) 返回将不匹配。您可能正在寻找dynamic query

标签: mysql function percentile


【解决方案1】:

你可以写一个PROCEDURE:

    CREATE DEFINER=`root`@`localhost` 
    PROCEDURE `sp_percentile`(tbl_name VARCHAR(2555),col_name VARCHAR(5000))
    BEGIN SET @sql = CONCAT('SELECT `',col_name,'` FROM (SELECT t.*,  @row_num :=@row_num + 1 AS row_num FROM `',tbl_name,'` t, (SELECT @row_num:=0) counter ORDER BY `',col_name,'`)  temp WHERE temp.row_num = ROUND (0.75* @row_num);'); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    END 

【讨论】:

    猜你喜欢
    • 2017-09-04
    • 2011-12-29
    • 2013-06-20
    • 1970-01-01
    • 2021-02-26
    • 2016-07-28
    • 2017-08-29
    • 2012-10-28
    • 2013-08-31
    相关资源
    最近更新 更多