В Oracle, WIDTH_BUCKET()
функцията ви позволява да конструирате хистограми с еднаква ширина, в които диапазонът на хистограмата е разделен на интервали с еднакъв размер.
За даден израз WIDTH_BUCKET()
връща номера на кофата, в която би попаднала стойността на този израз, след като бъде оценена.
Синтаксис
Синтаксисът е така:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Къде:
expr
е изразът, за който се създава хистограмата. Този израз трябва да се оценява до числова стойност или стойност за дата и час или до стойност, която може да бъде имплицитно преобразувана в числова стойност или стойност за дата и час. Акоexpr
оценява наnull
, тогава изразът връщаnull
.min_value
иmax_value
са изрази, които се разрешават до крайните точки на приемливия диапазон заexpr
. И двата израза трябва също да се оценяват до числови стойности или стойности за дата и час и нито един от тях не може да се оценява наnull
.num_buckets
е израз, който се разрешава до константа, указваща броя на кофите. Този израз трябва да се оценява като цяло положително число.
Пример
Ето пример, за да демонстрирате как работи.
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;
Резултат:
R1 R2 R3 _____ _____ _____ 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) AS r1,
WIDTH_BUCKET(5, 1, 12, 4) AS r2,
WIDTH_BUCKET(9, 1, 12, 4) AS r3
FROM DUAL;
И таблицата ще изглежда така:
Стойности | Кофа |
---|---|
1, 2, 3 | Кофа 1 |
4, 5, 6 | Кофа 2 |
7, 8, 9 | Кофа 3 |
10, 11, 12 | Кофа 4 |
Ето още един пример, в който се променят само размерите на кофата:
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;
Резултат:
R1 R2 R3 _____ _____ _____ 2 3 4
Извън обхват
Ако входът е извън обхвата на кофата, ще получите или 0
или num_buckets
+1, в зависимост от това дали входът е под диапазона или над него. В такива случаи Oracle Database създава подпоток с номер 0
и кофа за препълване с номер num_buckets
+1.
Пример:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Резултат:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) __________________________ __________________________ 0 4