הצטרפו לקבוצות שלנו לקבלת עדכונים מרוכזים פעם בשבוע:

ווטסאפ:
http://wa.dwh.co.il
טלגרם:
http://telegram.dwh.co.il

לעתים מזומנות במערכות BI, נהוג לחלק נתונים מספרים לקבוצות, לדוגמא, גיל. במקום לציין את הגיל, כלומר הזמן בשנים מתאריך הלידה ועד היום, אנו רוצים לשייך את הגיל לקבוצת גיל. הדרך המסורתית לעשות זאת, היא באמצעות טבלת קבוצות גיל המקושרת לשדה גיל על ידי complex join עם  Between.

בבסיס הנתונים Oracle, קיימת פונקציה מעניינת, המאפשרת את אותה פעולה בקלות רבה יותר. שם הפונקציה: WIDTH_BUCKET.

input:

הפונקציה מקבלת טווח נתונים המחולק לאינטרוולים ומחזירה את מספר האינטרוול שבו הערך נמצא.

(width_bucket(field,min,max,num_of_intervals

הסבר:

field: השדה המספרי שאותו רוצים לחלק לקבוצות

min: הערך המינימלי שאותו רוצים להכליל בקבוצות

max: הערך המקסימלי שאותו רוצים להכליל בקבוצות

num_of_intervals: מספר האינטרוולים לחלוקה

output:

מספר האינטרוול שבו הערך של השדה נמצא.

דוגמא:

טבלת emp מכילה שדה שכר: sal, המכיל את הערכים הבאים:

      SAL
     ------
      800
      950
     1100
     1250
     1300
     1500
     1600
     2450
     2850
     2975
     3000
     5000

לצורך העניין , נרצה לחלק את השכר ל3 קבוצות שכר:

0-2000, 2001-4000, 4001-6000

אם כך ,עלינו לבצע את השאילתא הבאה:

 select sal, width_bucket(sal,0,6000,3) grp from emp

ונקבל:

  GRP        SAL
----- ----------
  800           1
 1600          1
 1250          1
 2975          2
 1250          1
 2850          2
 2450          2
 3000          2
 5000          3
 1500          1
 1100          1

 GRP        SAL
----- ----------
  950           1
 3000          2
 1300          1

מהתוצאה של השאילתא, אנו רואים שהשכר הנמוך, קיבל קבוצה 1, השכר הבינוני, קיבל קבוצה 2, והשכר הגבוה, קיבל קבוצה 3.

שימו לב, לנקודות הבאות:

הפונקציה יכולה להחזיר גם ערך 0 שפרושו, מתחת למינימום שנקבע. או במקרה זה, מתחת ל0. כמו כן, יכולה להחזיר את הערך המקסימלי+1,שפרושו מעל הערך המקסימלי שנקבע. לדוגמא, אם היה בטבלה שכר של 8000, אזי הפונקציה היתה מחזירה 3+1, כלומר 4.

הגבול התחתון של האינטרוול, הוא הגבול התחתון המחושב, לעומת זאת, הגבול העליון הוא הגבול העליון המחושב פחות מספר קטן מאד. לדוגמא, אם הינו בוחרים מינימום 0 ומקסימום 10000 המחולק ל10 אינטרוולים. לדוגמא, הגבול התחתון של האינטרוול השלישי היה 2000, לעמות זאת, הגבול העליון של האינטרוול השלישי היה 3000 פחות אלפית האלפית. לכן המספר 3000 עצמו, נכלל כבר באינטרוול הרביעי!

sign.gif