Kategorien:

Numerische Funktionen

WIDTH_BUCKET

Konstruiert Equi-Width-Histogramme, bei denen der Histogrammbereich in Intervalle gleicher Größe unterteilt ist, und gibt die Bucket-Nummer zurück, in die der Wert eines Ausdrucks nach dessen Auswertung fällt. Die Funktion gibt einen ganzzahligen Wert oder Null zurück (wenn eine Eingabe Null ist).

Syntax

WIDTH_BUCKET( <expr> , <min_value> , <max_value> , <num_buckets> )
Copy

Argumente

expr

Der Ausdruck, für den das Histogramm erstellt wird. Dieser Ausdruck muss einen numerischen Wert oder einen Wert ergeben, der implizit in einen numerischen Wert konvertiert werden kann.

Der Wert muss im Bereich von -(2^53 - 1) bis 2^53 - 1 (inklusive) liegen.

min_value und max_value

Die unteren und oberen Endpunkte des akzeptablen Bereichs für den Ausdruck. Die Endpunkte müssen auch numerische Werte ergeben und dürfen nicht gleich sein.

Unterer und oberer Endpunkt müssen im Bereich von -(2^53 - 1) bis 2^53 - 1 (einschließlich) liegen. Außerdem muss die Differenz zwischen diesen Punkten kleiner sein als 2^53 (d. h. abs(max_value - min_value) < 2^53).

num_buckets

Die gewünschte Anzahl an Buckets; muss ein positiver ganzzahliger Wert sein. Jedem Bucket wird ein Wert aus dem Ausdruck zugewiesen, und die Funktion gibt dann die entsprechende Bucket-Zahl zurück.

Wenn ein Ausdruck außerhalb des Bereichs liegt, gibt die Funktion Folgendes zurück:

  • 0, wenn der Ausdruck kleiner als min_value ist.

  • num_buckets + 1, wenn der Ausdruck größer oder gleich max_value ist.

Beispiel

Erstellen Sie in der Spalte price ein Vier-Bucket-Histogramm für verkaufte Häuser im Preisbereich von 200.000–600.000 USD, sortiert nach Verkaufsdatum. Die Funktion gibt die Bucket-Zahl (SALES GROUP) für jeden Wert in der Gruppe zurück.

Erstellen Sie eine Tabelle, und füllen Sie diese:

CREATE TABLE home_sales (
    sale_date DATE,
    price NUMBER(11, 2)
    );
INSERT INTO home_sales (sale_date, price) VALUES 
    ('2013-08-01'::DATE, 290000.00),
    ('2014-02-01'::DATE, 320000.00),
    ('2015-04-01'::DATE, 399999.99),
    ('2016-04-01'::DATE, 400000.00),
    ('2017-04-01'::DATE, 470000.00),
    ('2018-04-01'::DATE, 510000.00);
Copy

Fragen Sie die Tabelle ab, indem Sie WIDTH_BUCKET() aufrufen:

SELECT 
    sale_date, 
    price,
    WIDTH_BUCKET(price, 200000, 600000, 4) AS "SALES GROUP"
  FROM home_sales
  ORDER BY sale_date;
+------------+-----------+-------------+
| SALE_DATE  |     PRICE | SALES GROUP |
|------------+-----------+-------------|
| 2013-08-01 | 290000.00 |           1 |
| 2014-02-01 | 320000.00 |           2 |
| 2015-04-01 | 399999.99 |           2 |
| 2016-04-01 | 400000.00 |           3 |
| 2017-04-01 | 470000.00 |           3 |
| 2018-04-01 | 510000.00 |           4 |
+------------+-----------+-------------+
Copy