Quartiles in SQL query

前端 未结 6 2103
面向向阳花
面向向阳花 2020-12-11 07:44

I have a very simple table like that:

CREATE TABLE IF NOT EXISTS LuxLog (
  Sensor TINYINT,
  Lux INT,
  PRIMARY KEY(Sensor)
)

It contains

6条回答
  •  生来不讨喜
    2020-12-11 08:12

    I use this solution with a MYSQL function :

    x is the centile you want

    array_values your group_concat values order and separated by ,

    DROP FUNCTION IF EXISTS centile;
    
    delimiter $$
    CREATE FUNCTION `centile`(x Text, array_values TEXT) RETURNS text
    BEGIN
    
    Declare DIFF_RANK TEXT;
    Declare RANG_FLOOR INT;
    Declare COUNT INT;
    Declare VALEUR_SUP TEXT;
    Declare VALEUR_INF TEXT;
    
    SET COUNT = LENGTH(array_values) - LENGTH(REPLACE(array_values, ',', '')) + 1;
    SET RANG_FLOOR = FLOOR(ROUND((x) * (COUNT-1),2));
    SET DIFF_RANK = ((x) * (COUNT-1)) - FLOOR(ROUND((x) * (COUNT-1),2));
    
    SET VALEUR_SUP = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(array_values,',', RANG_FLOOR+2),',',-1) AS DECIMAL);
    SET VALEUR_INF = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(array_values,',', RANG_FLOOR+1),',',-1) AS DECIMAL);
    
    /****
        https://fr.wikipedia.org/wiki/Quantile
        x_j+1 + g (x_j+2 - x_j+1)       
    ***/
    RETURN  Round((VALEUR_INF + (DIFF_RANK* (VALEUR_SUP-VALEUR_INF) ) ),2);
    
    END$$
    

    Example :

    Select centile(3/4,GROUP_CONCAT(lux ORDER BY lux SEPARATOR ',')) as quartile_3
    FROM LuxLog
    WHERE Sensor=12 AND Lux<>0
    

提交回复
热议问题