W PostgreSQL, width_bucket()
to funkcja matematyczna, która przypisuje wartości do segmentów (pojedynczych segmentów) w histogramie o równej szerokości.
Typ zwrotu to int .
Składnia
Funkcji można używać z jedną z trzech następujących składni:
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)
Pierwsze dwa są w zasadzie takie same, z wyjątkiem tego, że używają różnych typów danych (podwójna precyzja kontra numeryczna).
Te trzy składnie są wyjaśnione poniżej.
width_bucket(operand dp, b1 dp, b2 dp, count int)
- Zwraca numer kubełka, do którego byłby przypisany operand w histogramie z liczbą kubełków o równej szerokości obejmujących zakres od b1 do b2; zwraca 0 lub count+1 dla danych wejściowych spoza zakresu.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
- Zwraca numer kubełka, do którego byłby przypisany operand w histogramie z liczbą kubełków o równej szerokości obejmujących zakres od b1 do b2; zwraca 0 lub count+1 dla danych wejściowych spoza zakresu.
width_bucket(operand anyelement, thresholds anyarray)
- Zwraca numer kubełka, do którego zostałby przypisany operand, biorąc pod uwagę tablicę zawierającą dolne granice kubełków; zwraca 0 dla danych wejściowych mniejszych niż pierwsza dolna granica; tablica progów musi być posortowana, najpierw najmniejsza lub zostaną uzyskane nieoczekiwane wyniki.
Przykład — pierwsza/druga składnia
Jak wspomniano, pierwsze dwie składnie są w zasadzie takie same, z wyjątkiem tego, że określają różne typy danych (podwójna precyzja a numeryczna).
Oto przykład pokazujący, jak działają dwie pierwsze składnie.
SELECT
width_bucket(3, 1, 12, 3),
width_bucket(5, 1, 12, 3),
width_bucket(9, 1, 12, 3);
Wynik:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 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, używając 3 jako czwartego argumentu.
- Drugi i trzeci argument :określam, że zakres wynosi od 1 do 12. W tym przypadku mój drugi argument to 1, a trzeci to 12.
- 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 | Wiaderko 2 |
9, 10, 11, 12 | Wiaderko 3 |
Widzimy więc, że pierwsze wiadro akceptuje wartości z przedziału od 1 do 4, drugie wiadro od 5 do 8, a trzecie wiadro przyjmuje 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),
width_bucket(5, 1, 12, 4),
width_bucket(9, 1, 12, 4);
A stół wyglądałby tak:
Wartości | Wiadro |
---|---|
1, 2, 3 | Wiaderko 1 |
4, 5, 6 | Wiadro 2 |
7, 8, 9 | Wiaderko 3 |
10, 11, 12 | Wiadro 4 |
Poza zasięgiem
Jeśli dane wejściowe są poza zakresem zasobnika, otrzymasz 0 lub liczba +1, w zależności od tego, czy dane wejściowe są poniżej zakresu, czy powyżej.
Przykład:
SELECT
width_bucket(-3, 1, 12, 3),
width_bucket(20, 1, 12, 3);
Wynik:
width_bucket | width_bucket --------------+-------------- 0 | 4
Przykład – trzecia składnia
Aby zademonstrować trzecią składnię, weźmy pierwszy przykład powyżej i zmodyfikujmy go tak, aby używał trzeciej składni:
SELECT
width_bucket(3, array[1, 4, 8]),
width_bucket(5, array[1, 4, 8]),
width_bucket(9, array[1, 4, 8]);
Wynik:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Tutaj utworzyłem 3 wiadra i każdemu z nich przypisałem wyraźne wartości. W tym przypadku wszystkie są wiaderkami o równej szerokości, ale nie jest to wymagane.
Główną zaletą trzeciej składni jest to, że umożliwia tworzenie wiader o nierównej szerokości.
Na przykład, mógłbym zmodyfikować poprzedni przykład do tego:
SELECT
width_bucket(3, array[1, 3, 12]),
width_bucket(5, array[1, 3, 12]),
width_bucket(9, array[1, 3, 12]);
Wynik:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 2 | 2 | 2
Spowoduje to zmianę zasobników, do których przypisany jest każdy numer. Teraz wszystkie te liczby należą do drugiego wiadra.
Trzecia składnia może być przydatna w różnych przypadkach użycia. Na przykład możesz mieć różne grupy wiekowe, które nie są równomiernie rozłożone.
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)";
Wynik:
Age Group (15) | Age Group (45) | Age Group (50) ----------------+----------------+---------------- 1 | 3 | 4
Poza zasięgiem
Funkcja zwraca 0, jeśli dane wejściowe są mniejsze niż pierwsza dolna granica.
Przykład:
SELECT width_bucket(8, array[10, 40, 30]);
Wynik:
0
Width_Bucket() a CASE
Przykłady na tej stronie można również wykonać za pomocą CASE
oświadczenie. Różnica polega na tym, że width_bucket()
robi to w bardziej zwięzły sposób.
Oto jak możemy przepisać poprzedni przykład za pomocą CASE
oświadczenie.
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;
Wynik:
0
Pamiętaj, że dane wejściowe we wszystkich tych przykładach byłyby zwykle nazwą zmiennej lub kolumny, a nie stałą.