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.