V Oracle, WIDTH_BUCKET()
Funkce umožňuje konstruovat histogramy ekvišířky, ve kterých je rozsah histogramu rozdělen na intervaly, které mají stejnou velikost.
Pro daný výraz WIDTH_BUCKET()
vrátí číslo segmentu, do kterého by po vyhodnocení spadla hodnota tohoto výrazu.
Syntaxe
Syntaxe vypadá takto:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Kde:
expr
je výraz, pro který se histogram vytváří. Tento výraz se musí vyhodnotit jako číselná hodnota nebo hodnota datetime nebo hodnota, kterou lze implicitně převést na číselnou hodnotu nebo hodnotu datetime. Pokudexpr
vyhodnotí jakonull
, pak výraz vrátínull
.min_value
amax_value
jsou výrazy, které se rozlišují na koncové body přijatelného rozsahu proexpr
. Oba tyto výrazy se také musí vyhodnotit jako číselné hodnoty nebo hodnoty data a času a ani jeden nemůže být vyhodnocen jakonull
.num_buckets
je výraz, který se převádí na konstantu udávající počet segmentů. Tento výraz musí být vyhodnocen jako kladné celé číslo.
Příklad
Zde je příklad demonstrující, jak to funguje.
SELECT
WIDTH_BUCKET(3, 1, 12, 3) AS r1,
WIDTH_BUCKET(5, 1, 12, 3) AS r2,
WIDTH_BUCKET(9, 1, 12, 3) AS r3
FROM DUAL;
Výsledek:
R1 R2 R3 _____ _____ _____ 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 pomocí
3
jako čtvrtý argument. - 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 je12
. - 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) AS r1,
WIDTH_BUCKET(5, 1, 12, 4) AS r2,
WIDTH_BUCKET(9, 1, 12, 4) AS r3
FROM DUAL;
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 |
Zde je další příklad, ve kterém se mění pouze velikosti segmentů:
SELECT
WIDTH_BUCKET(5, 1, 12, 3) AS r1,
WIDTH_BUCKET(5, 1, 12, 6) AS r2,
WIDTH_BUCKET(5, 1, 12, 10) AS r3
FROM DUAL;
Výsledek:
R1 R2 R3 _____ _____ _____ 2 3 4
Mimo rozsah
Pokud je vstup mimo rozsah segmentu, dostanete buď 0
nebo num_buckets
+1, podle toho, zda je vstup pod rozsahem nebo nad ním. V takových případech Oracle Database vytvoří podtečený segment s číslem 0
a přepadový segment očíslovaný num_buckets
+1.
Příklad:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Výsledek:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) ___________________________ ___________________________ 0 0