Kategorien:

Fensterfunktionen

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).

Bemerkung

Die Funktion WIDTH_BUCKET ist keine echte Fensterfunktion. Sie kann jedoch weitestgehend als Fensterfunktion kategorisiert, weil:

  • Sie führt fensterähnliche Operationen für eine Gruppe von Zeilen aus.

  • Sie verhält sich wie ein Fenster:

    • Die Anzahl der Rückgabewerte entspricht der Anzahl der Eingabewerte. (Es handelt sich also nicht um eine Aggregatfunktion.)

    • Jeder Rückgabewert hängt nicht nur von der aktuellen Zeile ab, sondern auch von den anderen Zeilen in der Gruppe. (Somit ist es keine Skalarfunktion.)

Syntax

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

Argumente

Ausdruck

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

Minimumwert und Maximumwert

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

Anzahl_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 Minimumwert ist.

  • Anzahl_Buckets + 1, wenn der Ausdruck größer oder gleich Maximumwert ist.

Beispiel

Erstellen Sie in der Spalte price ein Vier-Bucket-Histogramm für verkaufte Häuser im Preisbereich von $200.000–600.000, 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);

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 |
+------------+-----------+-------------+