In PostgreSQL width_bucket()
ist eine mathematische Funktion, die Buckets (einzelne Segmente) in einem Histogramm gleicher Breite Werte zuweist.
Der Rückgabetyp ist int .
Syntax
Die Funktion kann mit einer der drei folgenden Syntaxen verwendet werden:
width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)
Die ersten beiden sind im Grunde gleich, außer dass sie unterschiedliche Datentypen verwenden (doppelte Genauigkeit vs. numerisch).
Diese drei Syntaxen werden unten erklärt.
width_bucket(operand dp, b1 dp, b2 dp, count int)
- Gibt die Bucket-Nummer zurück, der der Operand in einem Histogramm mit einer Anzahl von Buckets gleicher Breite zugewiesen werden würde, die den Bereich b1 bis b2 überspannen; gibt 0 oder count+1 für eine Eingabe außerhalb des Bereichs zurück.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
- Gibt die Bucket-Nummer zurück, der der Operand in einem Histogramm mit einer Anzahl von Buckets gleicher Breite zugewiesen werden würde, die den Bereich b1 bis b2 überspannen; gibt 0 oder count+1 für eine Eingabe außerhalb des Bereichs zurück.
width_bucket(operand anyelement, thresholds anyarray)
- Gibt die Bucket-Nummer zurück, der der Operand zugewiesen würde, wenn ein Array gegeben wäre, das die unteren Grenzen der Buckets auflistet; gibt 0 für eine Eingabe zurück, die kleiner als die erste untere Grenze ist; das Schwellenwertarray muss sortiert werden, kleinste zuerst, sonst werden unerwartete Ergebnisse erhalten.
Beispiel – Erste/Zweite Syntax
Wie bereits erwähnt, sind die ersten beiden Syntaxen im Grunde gleich, außer dass sie die unterschiedlichen Datentypen umreißen (doppelte Genauigkeit vs. numerisch).
Hier ist ein Beispiel, um zu demonstrieren, wie die ersten beiden Syntaxen funktionieren.
SELECT
width_bucket(3, 1, 12, 3),
width_bucket(5, 1, 12, 3),
width_bucket(9, 1, 12, 3);
Ergebnis:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Hier ist eine Erklärung. Lassen Sie uns jedes Argument untersuchen, beginnend mit dem letzten und rückwärts zum ersten arbeiten.
- Viertes Argument :Ich gebe drei Eimer an. Ich mache das, indem ich 3 als viertes Argument verwende.
- Zweites und drittes Argument :Ich gebe an, dass der Bereich zwischen 1 und 12 liegt. In diesem Fall ist mein zweites Argument 1 und mein drittes Argument 12.
- Erstes Argument :Dieser Wert wird mit dem zweiten und dritten Argument verglichen, um zu wissen, welchem der drei Buckets er zugewiesen werden soll. In meinem Beispiel rufe ich
width_bucket()
auf dreimal, um das Konzept besser zu veranschaulichen. Ich mache das, damit ich als erstes Argument drei verschiedene Werte angeben kann, von denen jeder einem anderen Bucket zugewiesen ist.
Die folgende Tabelle bietet eine andere Möglichkeit, dies zu visualisieren:
Werte | Eimer |
---|---|
1, 2, 3, 4 | Eimer 1 |
5, 6, 7, 8 | Eimer 2 |
9, 10, 11, 12 | Eimer 3 |
Wir können also sehen, dass der erste Bucket Werte zwischen 1 und 4 akzeptiert, der zweite Bucket zwischen 5 und 8 und der dritte Bucket Werte zwischen 9 und 12.
Wenn ich es so ändern würde, dass es vier Buckets gäbe, könnte mein Code etwa so aussehen:
SELECT
width_bucket(3, 1, 12, 4),
width_bucket(5, 1, 12, 4),
width_bucket(9, 1, 12, 4);
Und die Tabelle würde so aussehen:
Werte | Eimer |
---|---|
1, 2, 3 | Eimer 1 |
4, 5, 6 | Eimer 2 |
7, 8, 9 | Eimer 3 |
10, 11, 12 | Eimer 4 |
Außer Reichweite
Wenn die Eingabe außerhalb des Bucket-Bereichs liegt, erhalten Sie entweder 0 oder count +1, je nachdem, ob der Eingang unter oder über dem Bereich liegt.
Beispiel:
SELECT
width_bucket(-3, 1, 12, 3),
width_bucket(20, 1, 12, 3);
Ergebnis:
width_bucket | width_bucket --------------+-------------- 0 | 4
Beispiel – Dritte Syntax
Um die dritte Syntax zu demonstrieren, nehmen wir das erste obige Beispiel und ändern es so, dass es die dritte Syntax verwendet:
SELECT
width_bucket(3, array[1, 4, 8]),
width_bucket(5, array[1, 4, 8]),
width_bucket(9, array[1, 4, 8]);
Ergebnis:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Hier habe ich 3 Buckets erstellt und jedem explizite Werte zugewiesen. In diesem Fall sind sie alle Buckets gleicher Breite, aber das ist keine Voraussetzung.
Ein großer Vorteil der dritten Syntax besteht darin, dass Sie Buckets mit ungleicher Breite erstellen können.
Zum Beispiel könnte ich das vorherige Beispiel so ändern:
SELECT
width_bucket(3, array[1, 3, 12]),
width_bucket(5, array[1, 3, 12]),
width_bucket(9, array[1, 3, 12]);
Ergebnis:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 2 | 2 | 2
Dadurch werden die Buckets geändert, denen jede Nummer zugewiesen ist. Jetzt gehören all diese Nummern in den zweiten Eimer.
Die dritte Syntax könnte für eine Vielzahl von Anwendungsfällen nützlich sein. Zum Beispiel könnten Sie eine Reihe von Altersgruppen haben, die nicht gleichmäßig verteilt sind.
SELECT
width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";
Ergebnis:
Age Group (15) | Age Group (45) | Age Group (50) ----------------+----------------+---------------- 1 | 3 | 4
Außer Reichweite
Die Funktion gibt 0 zurück, wenn die Eingabe kleiner als die erste untere Grenze ist.
Beispiel:
SELECT width_bucket(8, array[10, 40, 30]);
Ergebnis:
0
Width_Bucket() vs. CASE
Die Beispiele auf dieser Seite könnten auch mit einem CASE
erstellt werden Erklärung. Der Unterschied besteht darin, dass width_bucket()
macht es prägnanter.
So könnten wir das vorherige Beispiel mit einem CASE
umschreiben Aussage.
SELECT
CASE
WHEN 8 BETWEEN 0 AND 9 THEN 0
WHEN 8 BETWEEN 10 AND 39 THEN 1
WHEN 8 BETWEEN 40 AND 49 THEN 2
ELSE 3
END;
Ergebnis:
0
Denken Sie daran, dass die Eingabe in all diesen Beispielen normalerweise eher eine Variable oder ein Spaltenname als eine Konstante ist.