PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von Width_Bucket() in PostgreSQL

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.