PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как работи Width_Bucket() в PostgreSQL

В PostgreSQL, width_bucket() е математическа функция, която присвоява стойности на сегменти (отделни сегменти) в хистограма с еквиширина.

Типът на връщане е int .

Синтаксис

Функцията може да се използва с всеки от следните три синтаксиса:

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)

Първите две са по същество еднакви, с изключение на това, че използват различни типове данни (двойна точност срещу числови).

Тези три синтаксиса са обяснени по-долу.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Връща номера на кофата, на която би бил присвоен операнд в хистограма, имаща броя на кофите с еднаква ширина, обхващащи диапазона от b1 до b2; връща 0 или count+1 за вход извън диапазона.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Връща номера на кофата, на която би бил присвоен операнд в хистограма, имаща броя на кофите с еднаква ширина, обхващащи диапазона от b1 до b2; връща 0 или count+1 за вход извън диапазона.
width_bucket(operand anyelement, thresholds anyarray)
Връща номера на пакета, на който би бил присвоен операнд, като се има предвид масив, изброяващ долните граници на сегментите; връща 0 за вход, по-малък от първата долна граница; масивът с прагове трябва да бъде сортиран, първо ще се получат най-малките или ще се получат неочаквани резултати.

Пример – Първи/Втори синтаксис

Както споменахме, първите два синтаксиса са по същество еднакви, с изключение на това, че очертават различните типове данни (двойна точност срещу числови).

Ето пример, за да демонстрирате как работят първите два синтаксиса.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Резултат:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Ето едно обяснение. Нека разгледаме всеки аргумент, като започнем от последния и се върнем към първия.

  • Четвърти аргумент :Посочвам три кофи. Правя това, като използвам 3 като четвърти аргумент.
  • Втори и трети аргумент :Уточнявам, че диапазонът е между 1 и 12. В този случай вторият ми аргумент е 1, а третият аргумент е 12.
  • Първи аргумент :Тази стойност се сравнява с втория и третия аргумент, за да се знае към коя от трите кофи трябва да бъде присвоена. В моя пример извиквам width_bucket() три пъти, за да се илюстрира по-добре концепцията. Правя това, за да мога да предоставя три различни стойности като първи аргумент, всяка от които е присвоена на различен сегмент.

Следната таблица предоставя друг начин за визуализиране на това:

Стойности Кофа
1, 2, 3, 4 Кофа 1
5, 6, 7, 8 Кофа 2
9, 10, 11, 12 Кофа 3

Така че можем да видим, че първата група приема стойности между 1 и 4, втората група между 5 и 8, а третата кофа е за стойности между 9 и 12.

Ако трябваше да го променя така, че да има четири кофи, кодът ми може да изглежда така:

SELECT 
  width_bucket(3, 1, 12, 4),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

И таблицата ще изглежда така:

Стойности Кофа
1, 2, 3 Кофа 1
4, 5, 6 Кофа 2
7, 8, 9 Кофа 3
10, 11, 12 Кофа 4

Извън обхват

Ако входът е извън обхвата на кофата, ще получите или 0, или брой +1, в зависимост от това дали входът е под диапазона или над него.

Пример:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Резултат:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Пример – Трети синтаксис

За да демонстрираме третия синтаксис, нека вземем първия пример по-горе и го модифицираме, за да използва третия синтаксис:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Резултат:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Тук създадох 3 кофи и присвоих изрични стойности на всяка от тях. В този случай всички те са с еднаква ширина, но това не е изискване.

Основно предимство на третия синтаксис е, че ви позволява да създавате кофи с неравна ширина.

Например, бих могъл да променя предишния пример на това:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Резултат:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Това променя кофите, към които е присвоен всеки номер. Сега всички тези числа принадлежат към втората кофа.

Третият синтаксис може да бъде полезен за различни случаи на употреба. Например, може да имате набор от възрастови групи, които не са равномерно разпределени.

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)";

Резултат:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Извън обхват

Функцията връща 0, ако входът е по-малък от първата долна граница.

Пример:

SELECT width_bucket(8, array[10, 40, 30]);

Резултат:

0

Width_Bucket() срещу CASE

Примерите на тази страница могат да бъдат направени и с помощта на CASE изявление. Разликата е, че width_bucket() го прави по по-сбит начин.

Ето как можем да пренапишем предишния пример с помощта на CASE изявление.

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;

Резултат:

0

Имайте предвид, че входът във всички тези примери обикновено би бил променлива или име на колона, а не константа.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy множество външни ключове в един съпоставен клас към същия първичен ключ

  2. Сортиране по колона ASC, но първо NULL стойности?

  3. Какво е новото в Postgres-XL 9.6

  4. Концепции за висока достъпност на Oracle в PostgreSQL

  5. PostgreSQL как да видите кои заявки са изпълнени