Catégories :

Fonctions d’agrégation (estimation du centile), Fonctions de la fenêtre

APPROX_PERCENTILE_ACCUMULATE

Renvoie la représentation interne de l’état t-Digest (sous forme d’un objet JSON) à la fin de l’agrégation. (Pour plus d’informations sur t-Digest, voir : Estimation des valeurs centiles.)

La fonction APPROX_PERCENTILE ignore cet état interne intermédiaire lorsque l’estimation finale en centiles est renvoyée. Toutefois, dans certains cas d’utilisation avancés, tels que l’estimation du centile incrémentiel lors du chargement en bloc, vous pouvez conserver l’état intermédiaire. Dans ce cas, vous utiliserez APPROX_PERCENTILE_ACCUMULATE au lieu de APPROX_PERCENTILE.

APPROX_PERCENTILE_ACCUMULATE ne renvoie pas une valeur en centile. Au lieu de cela, il renvoie l’état de l’algorithme lui-même. Plus tard, l’état intermédiaire peut être :

  • Combiné (c’est-à-dire fusionné) avec d’autres états intermédiaires provenant de lots de données distincts mais liés.

  • Traité par d’autres fonctions qui agissent directement sur l’état intermédiaire, par exemple, APPROX_PERCENTILE_ESTIMATE. (Pour un exemple, voir la section Exemples ci-dessous.)

  • Exporté vers des outils externes.

Voir aussi :

APPROX_PERCENTILE_COMBINE , APPROX_PERCENTILE_ESTIMATE

Syntaxe

APPROX_PERCENTILE_ACCUMULATE( <expr> )

Arguments

expr

Une expression valide, telle qu’un nom de colonne, qui donne une valeur numérique.

Notes sur l’utilisation

  • Le centile ne fonctionne que sur les valeurs numériques. Par conséquent, expr doit générer des valeurs numériques ou être convertie en nombres.

Exemple

Stockez l’état t-Digest de la colonne testTable.c1 dans une table, puis utilisez-le pour calculer les centiles :

-- create a table from the accumulated t-Digest state for testtable.c1
create or replace table resultstate as (approx_percentile_accumulate(c1) s from testtable);

-- next use the t-Digest state to compute percentiles for testtable

-- returns an approximated value for the 1.5th percentile of testtable.c1
select approx_percentile_estimate(s, 0.015) from resultstate;

 -- returns an approximated value for the 20th percentile of testtable.c1
 select approx_percentile_estimate(s, 0.2) from resultstate;

Voici un exemple plus détaillé. Celui-ci démontre l’utilisation des trois fonctions liées : APPROX_PERCENTILE_ACCUMULATE, APPROX_PERCENTILE_ESTIMATE et APPROX_PERCENTILE_COMBINE :

Créez une table et des données simples :

-- Create a table and insert some rows for which we'll later estimate the 
-- median value (the value at the 50th percentile).
CREATE OR REPLACE TABLE test_table1 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table1 (c1) VALUES (1), (2), (3), (4);

Créez une table contenant « l’état » qui représente les informations relatives au centile approximatif actuel pour la table nommée test_table1 :

CREATE OR REPLACE TABLE resultstate1 AS (
     SELECT approx_percentile_accumulate(c1) AS rs1
        FROM test_table1);

Utilisez ces informations d’état pour afficher l’estimation actuelle de la valeur médiane (0,5 signifie que nous voulons la valeur au 50e centile) :

SELECT approx_percentile_estimate(rs1, 0.5) 
    FROM resultstate1;

Sortie :

+--------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(RS1, 0.5) |
|--------------------------------------|
|                                  2.5 |
+--------------------------------------+

Créez maintenant une deuxième table et ajoutez des données. (Dans une situation plus réaliste, l’utilisateur aurait pu charger plus de données dans la première table et les diviser en ensembles ne se chevauchant pas en fonction de l’heure à laquelle les données ont été chargées.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table2 (c1) VALUES (5), (6), (7), (8);

Obtenez les informations « d’état » pour les nouvelles données uniquement.

CREATE OR REPLACE TABLE resultstate2 AS 
  (SELECT approx_percentile_accumulate(c1) AS rs1 
     FROM test_table2);

Combiner les informations « d’état » pour les deux lots de lignes :

CREATE OR REPLACE TABLE combined_resultstate (c1) AS 
  SELECT approx_percentile_combine(rs1) AS apc1
    FROM (
        SELECT rs1 FROM resultstate1
        UNION ALL
        SELECT rs1 FROM resultstate2
      )
      ;

Obtenir la valeur médiane approximative de l’ensemble des lignes combinées :

SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;

Sortie :

+-------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(C1, 0.5) |
|-------------------------------------|
|                                 4.5 |
+-------------------------------------+