W Oracle WIDTH_BUCKET()
Funkcja umożliwia konstruowanie histogramów równorzędnych, w których zakres histogramu jest podzielony na przedziały o identycznej wielkości.
Dla danego wyrażenia WIDTH_BUCKET()
zwraca numer segmentu, do którego spadłaby wartość tego wyrażenia po przeanalizowaniu.
Składnia
Składnia wygląda tak:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Gdzie:
expr
to wyrażenie, dla którego tworzony jest histogram. To wyrażenie musi być ocenione jako wartość liczbowa lub data-godzina lub wartość, którą można niejawnie przekonwertować na wartość liczbową lub datę i godzinę. Jeśliexpr
ocenia nanull
, wyrażenie zwracanull
.min_value
imax_value
to wyrażenia, które rozwiązują się do punktów końcowych dopuszczalnego zakresu dlaexpr
. Oba te wyrażenia muszą również szacować się na wartości liczbowe lub daty i godziny i żadne z nich nie może szacować nanull
.num_buckets
to wyrażenie, które rozwiązuje się do stałej wskazującej liczbę wiader. To wyrażenie musi dać w wyniku dodatnią liczbę całkowitą.
Przykład
Oto przykład pokazujący, jak to działa.
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;
Wynik:
R1 R2 R3 _____ _____ _____ 1 2 3
Oto wyjaśnienie. Zbadajmy każdy argument, zaczynając od ostatniego i pracując wstecz do pierwszego.
- Czwarty argument :Podaję trzy wiadra. Robię to za pomocą
3
jako czwarty argument. - Drugi i trzeci argument :określam, że zakres wynosi od 1 do 12. W tym przypadku moim drugim argumentem jest
1
a trzecim argumentem jest12
. - Pierwszy argument :Ta wartość jest porównywana z drugim i trzecim argumentem, aby wiedzieć, do którego z trzech segmentów powinna być przypisana. W moim przykładzie wywołuję
WIDTH_BUCKET()
trzy razy, aby lepiej zilustrować tę koncepcję. Robię to, aby jako pierwszy argument podać trzy różne wartości, z których każda jest przypisana do innego zasobnika.
Poniższa tabela przedstawia inny sposób wizualizacji tego:
Wartości | Wiadro |
---|---|
1, 2, 3, 4 | Wiaderko 1 |
5, 6, 7, 8 | Wiadro 2 |
9, 10, 11, 12 | Wiaderko 3 |
Widzimy więc, że pierwsze wiaderko przyjmuje wartości od 1 do 4, drugie wiadro od 5 do 8, a trzecie wiaderko jest przeznaczone na wartości od 9 do 12.
Gdybym miał to zmienić tak, aby były cztery wiadra, mój kod mógłby wyglądać mniej więcej tak:
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 stół wyglądałby tak:
Wartości | Wiadro |
---|---|
1, 2, 3 | Wiaderko 1 |
4, 5, 6 | Wiaderko 2 |
7, 8, 9 | Wiaderko 3 |
10, 11, 12 | Wiadro 4 |
Oto kolejny przykład, w którym zmieniają się tylko rozmiary wiader:
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;
Wynik:
R1 R2 R3 _____ _____ _____ 2 3 4
Poza zasięgiem
Jeśli dane wejściowe są poza zakresem zasobnika, otrzymasz 0
lub num_buckets
+1, w zależności od tego, czy wejście znajduje się poniżej zakresu, czy powyżej. W takich przypadkach Oracle Database tworzy zasobnik niedomiaru o numerze 0
i wiadro przelewowe o numerze num_buckets
+1.
Przykład:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Wynik:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) __________________________ __________________________ 0 4