sql >> Databáze >  >> RDS >> PostgreSQL

Jak funguje Width_Bucket() v PostgreSQL

V PostgreSQL width_bucket() je matematická funkce, která přiřazuje hodnoty segmentům (jednotlivým segmentům) v histogramu ekvišířky.

Návratový typ je int .

Syntaxe

Funkci lze použít s kteroukoli ze tří následujících syntaxí:

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)

První dva jsou v podstatě stejné, až na to, že používají různé datové typy (dvojitá přesnost vs. numerická).

Tyto tři syntaxe jsou vysvětleny níže.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Vrátí číslo segmentu, kterému by byl přiřazen operand v histogramu obsahujícím segmenty o stejné šířce v rozsahu b1 až b2; vrátí 0 nebo počet+1 pro vstup mimo rozsah.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Vrátí číslo segmentu, kterému by byl přiřazen operand v histogramu obsahujícím segmenty o stejné šířce v rozsahu b1 až b2; vrátí 0 nebo počet+1 pro vstup mimo rozsah.
width_bucket(operand anyelement, thresholds anyarray)
Vrátí číslo segmentu, ke kterému by byl přiřazen operand, za předpokladu, že pole vypisuje spodní hranice segmentů; vrátí 0 pro vstup menší než první dolní mez; pole prahů musí být seřazeno od nejmenšího napřed, jinak budou získány neočekávané výsledky.

Příklad – První/Druhá syntaxe

Jak již bylo zmíněno, první dvě syntaxe jsou v zásadě stejné, až na to, že nastiňují různé datové typy (dvojitá přesnost vs. numerická).

Zde je příklad demonstrující, jak fungují první dvě syntaxe.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Výsledek:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Zde je vysvětlení. Prozkoumejme každý argument, začněme od posledního a postupujeme zpět k prvnímu.

  • Čtvrtý argument :Uvádím tři kbelíky. Dělám to tak, že jako čtvrtý argument použiji 3.
  • Druhý a třetí argument :Uvádím, že rozsah je mezi 1 a 12. V tomto případě je můj druhý argument 1 a třetí argument je 12.
  • První argument :Tato hodnota se porovnává s druhým a třetím argumentem, abychom věděli, ke kterému ze tří segmentů má být přiřazena. V mém příkladu volám width_bucket() třikrát, aby byl koncept lépe ilustrován. Dělám to proto, abych jako první argument mohl uvést tři různé hodnoty, z nichž každá je přiřazena k jinému segmentu.

Následující tabulka poskytuje další způsob vizualizace:

Hodnoty Kbelík
1, 2, 3, 4 Segment 1
5, 6, 7, 8 Segment 2
9, 10, 11, 12 Segment 3

Vidíme tedy, že první segment přijímá hodnoty mezi 1 a 4, druhý segment mezi 5 a 8 a třetí segment je pro hodnoty mezi 9 a 12.

Pokud bych to změnil tak, aby byly čtyři segmenty, můj kód by mohl vypadat nějak takto:

SELECT 
  width_bucket(3, 1, 12, 4),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

A tabulka by vypadala takto:

Hodnoty Kbelík
1, 2, 3 Segment 1
4, 5, 6 Segment 2
7, 8, 9 Segment 3
10, 11, 12 Segment 4

Mimo rozsah

Pokud je vstup mimo rozsah segmentu, dostanete buď 0, nebo count +1, v závislosti na tom, zda je vstup pod rozsahem nebo nad ním.

Příklad:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Výsledek:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Příklad – Třetí syntaxe

Abychom demonstrovali třetí syntaxi, vezměme si první příklad výše a upravme jej tak, aby používal třetí syntaxi:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Výsledek:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Zde jsem vytvořil 3 buckety a každému přiřadil explicitní hodnoty. V tomto případě jsou všechny stejně široké, ale není to podmínkou.

Hlavní výhodou třetí syntaxe je to, že umožňuje vytvářet skupiny nestejné šířky.

Mohl bych například upravit předchozí příklad na tento:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Výsledek:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Tím se změní segmenty, ke kterým je každé číslo přiřazeno. Nyní všechna tato čísla patří do druhého segmentu.

Třetí syntaxe by mohla být užitečná pro různé případy použití. Můžete mít například řadu věkových skupin, které nejsou rovnoměrně rozděleny.

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

Výsledek:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Mimo rozsah

Funkce vrátí 0, pokud je vstup menší než první dolní mez.

Příklad:

SELECT width_bucket(8, array[10, 40, 30]);

Výsledek:

0

Width_Bucket() vs CASE

Příklady na této stránce lze také provést pomocí CASE prohlášení. Rozdíl je v tom, že width_bucket() dělá to stručněji.

Zde je návod, jak bychom mohli přepsat předchozí příklad pomocí CASE prohlášení.

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;

Výsledek:

0

Mějte na paměti, že vstupem ve všech těchto příkladech by normálně byl název proměnné nebo sloupce, nikoli konstanta.


  1. Povolit vzdálený přístup k databázi MySQL

  2. Volání uložené procedury Java v programu Java

  3. Jak se připojit ke vzdálené databázi PostgreSQL přes SSL s Pythonem

  4. XML Server Optimalizace výkonu XML