PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak działa Width_Bucket() w PostgreSQL

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łą.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dynamiczny SQL (EXECUTE) jako warunek instrukcji IF

  2. Jak tworzyć i usuwać bazy danych i tabele w PostgreSQL

  3. PostgreSQL:Jak ustawić search_path na poziomie użytkownika?

  4. Typ danych Postgres ENUM czy SPRAWDŹ OGRANICZENIE?

  5. zaktualizuj zapytanie z połączeniem na dwóch stołach