Kategorien:

Aggregatfunktionen (Perzentilschätzung), Fensterfunktionen

APPROX_PERCENTILE_ACCUMULATE

Gibt am Ende der Aggregation die interne Darstellung des t-Digest-Status zurück (als JSON-Objekt). (Weitere Informationen zu t-Digest finden Sie unter: Schätzen von Perzentilwerten.)

Die Funktion APPROX_PERCENTILE verwirft diesen internen Zwischenstatus, sobald die endgültige Perzentilschätzung zurückgegeben wird. In bestimmten fortgeschrittenen Anwendungsfällen, beispielsweise Schätzen inkrementeller Perzentile beim Massenladen, möchten Sie den Zwischenstatus möglicherweise beibehalten. In diesem Fall würden Sie APPROX_PERCENTILE_ACCUMULATE anstelle von APPROX_PERCENTILE verwenden.

APPROX_PERCENTILE_ACCUMULATE gibt keinen Perzentilwert zurück. Stattdessen wird der algorithmische Status selbst zurückgegeben. Der Zwischenstatus kann später lauten:

  • Kombiniert (d. h. zusammengeführt) mit anderen Zwischenstatus aus separaten, aber verwandten Datenbatches.

  • Verarbeitet durch andere Funktionen, die direkt mit dem Zwischenstatus operieren, z. B. APPROX_PERCENTILE_ESTIMATE. (Ein Beispiel dazu finden Sie unten im Abschnitt „Beispiele“.)

  • Exportiert in externe Tools.

Siehe auch:

APPROX_PERCENTILE_COMBINE, APPROX_PERCENTILE_ESTIMATE

Syntax

APPROX_PERCENTILE_ACCUMULATE( <expr> )
Copy

Argumente

expr

Ein gültiger Ausdruck, z. B. ein Spaltenname, der einen numerischen Wert ergibt.

Nutzungshinweise

  • Perzentile funktionieren nur bei numerischen Werten. Daher muss expr Werte erzeugen, die Zahlen sind oder in Zahlen umgewandelt werden können.

Beispiel

Speichern Sie den t-Digest-Status der Spalte testTable.c1 in einer Tabelle, und verwenden Sie dann den Status zum Berechnen von Perzentilen:

-- create a table from the accumulated t-Digest state for testtable.c1
create or replace table resultstate as
    select 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;
Copy

Hier ist ein ausführlicheres Beispiel. In diesem Beispiel wird die Verwendung aller drei verwandten Funktionen veranschaulicht: APPROX_PERCENTILE_ACCUMULATE, APPROX_PERCENTILE_ESTIMATE und APPROX_PERCENTILE_COMBINE:

Erstellen Sie eine einfache Tabelle und Daten:

-- 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);
Copy

Erstellen Sie eine Tabelle, die den „Status“ enthält, der die aktuellen approximierten Perzentilinformationen für die Tabelle namens test_table1 darstellt:

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

Verwenden Sie diese Statusinformationen, um die aktuelle Schätzung des Medianwerts anzuzeigen (0,5 bedeutet, dass der Wert beim 50. Perzentil sein soll):

SELECT approx_percentile_estimate(rs1, 0.5) 
    FROM resultstate1;
Copy

Ausgabe:

SELECT approx_percentile_estimate(rs1, 0.5) 
    FROM resultstate1;
+--------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(RS1, 0.5) |
|--------------------------------------|
|                                  2.5 |
+--------------------------------------+
Copy

Erstellen Sie nun eine zweite Tabelle und fügen Sie Daten hinzu. (In einer realistischeren Situation hätte der Benutzer möglicherweise mehr Daten in die erste Tabelle geladen und die Daten anhand der Zeit, zu der die Daten geladen wurden, in nicht überlappende Sätze unterteilt.)

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

Rufen Sie die „Statusinformationen“ nur für die neuen Daten ab.

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

Kombinieren Sie die „Statusinformationen“ für die zwei Mengen von Zeilen:

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
      )
      ;
Copy

Ermitteln Sie den approximierten Medianwert der kombinierten Zeilenmenge:

SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;
Copy

Ausgabe:

SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;
+-------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(C1, 0.5) |
|-------------------------------------|
|                                 4.5 |
+-------------------------------------+
Copy