PracticU

SCD - Slowly Changing Dimension - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס SSIS › SCD - Slowly Changing Dimension - חלק 2
מילון מושגים:
SSIS - רכיב של SQL Server לבניית תהליכי ETL להעברה ולעיבוד של נתונים בין מקורות.
CSV - קובץ טקסט פשוט לאחסון נתונים טבלאיים, שבו הערכים בכל שורה מופרדים בפסיקים.
ביט - יחידת המידע הקטנה ביותר במחשב, שערכה 0 או 1. שמונה ביטים מרכיבים בייט.
Integer - סוג נתונים למספר שלם, כלומר מספר ללא חלק עשרוני.
Unicode - תקן קידוד תווים אוניברסלי שמכסה את כתבי השפות בעולם, ומאפשר לייצג כמעט כל תו.
בוליאני - סוג נתונים שיכול לקבל אחד משני ערכים בלבד: אמת (true) או שקר (false).
מפתח ראשי - עמודה או צירוף עמודות שמזהים באופן ייחודי כל שורה בטבלת מסד נתונים.

SCD - Slowly Changing Dimension - חלק 2
בהדגמה הזו בונים ב-SSIS תהליך עם האובייקט Slowly Change Dimension: טוענים קובץ CSV של מוצרים לטבלת Products, מגדירים אילו עמודות נדרסות ואילו שומרות היסטוריה, ובודקים מה קורה כששם או מחיר של מוצר משתנים.
הכנת הטבלה והנתונים
1. עמודות תקורה: לפני הטעינה מוסיפים לטבלת Products, עם ALTER TABLE, שלוש עמודות: StartDate ו-EndDate מסוג datetime שמקבלות NULL, ו-IsCurrent מסוג bit.
2. מקור ו-Data Flow: בתוך Data Flow Task מגדירים כמקור Flat File Connection לקובץ Product CSV.
3. Data Conversion: כל העמודות מהקובץ מגיעות כמחרוזות, ולכן ממירים אותן לסוגי טבלת היעד: מספרים שלמים ל-4 byte signed integer, שמות וטקסטים ל-Unicode String, המחיר ל-Currency, שלוש עמודות הכמויות ל-2 byte signed integer (המקביל ל-smallint) ו-Discontinued ל-Boolean. מכאן עובדים עם עמודות ה-Output Alias החדשות, "Copy of ...".
4. גודל השדות: באזהרת Truncation על Quantity Per Unit התאימו את אורך ההמרה לטבלה. Unicode תופס שני בתים לתו, ולכן מכניסים חצי מהגודל בבתים (למשל 40 לשם המוצר ו-20 לכמות). האזהרה נשארת כאזהרה בלבד.
הוויזארד של האובייקט
1. טבלת יעד: בוחרים את Products כטבלת ה-Dimension. ממפים כל שדה ל-Copy of המתאים לו, ולא ממפים את StartDate ו-EndDate.
2. Business Key: חובה לסמן לפחות עמודה אחת כ-Business Key, ובדוגמה זה Product ID.
3. סוג שינוי לכל עמודה: האפשרויות הן Fixed Attribute (Type 0, שינוי נחשב שגיאה), Changing Attribute (Type 1, דריסה) ו-Historical Attribute (Type 2, שמירת היסטוריה). בדוגמה בחרו Historical עבור Product Name ו-Unit Price, ו-Fixed עבור Units in Stock לצורך המחשה.
4. Fixed ו-Changing: משאירים לא מסומן את הסימון להכשלת התהליך, כך ששינוי ב-Fixed לא נכנס אבל גם לא מכשיל. את סימון עדכון ה-Matching Records משאירים כבוי.
5. מעקב אחרי Historical: הוויזארד מאפשר לבחור או עמודה אחת (Is Current עם ערכי Current ו-Expired) או שתי עמודות תאריך. אי אפשר את שתיהן יחד. בדוגמה בחרו Start ו-End, והתאריך נלקח ממשתנה מערכת, כאן System::ContainerStartTime.
6. Inferred Members: נוגע למצב שבו טוענים נתוני Fact לפני ה-Dimensions ואין עדיין Surrogate Key. בדוגמה מכבים את האפשרות.
מה הוויזארד יוצר ואיך זה עובד
1. ענף של שינויים רגילים: פקודת UPDATE על Products שמעדכנת את העמודות שמותר לשנות, רק לרשומות עם EndDate IS NULL.
2. ענף היסטורי: Derived Column שיוצר EndDate מתחילת ריצת הקונטיינר, פקודת UPDATE שסוגרת את הרשומה הקודמת, ו-Union All שמחזיר את הרשומה כדי להוסיף אותה כחדשה עם StartDate, ואז Insert.
בדיקה בפועל
1. לפני ההרצה מורידים מהטבלה את ה-primary key ואת ה-identity של Product ID.
2. ההרצה הראשונה טענה 77 שורות. הרצה שנייה בלי שינוי לא הוסיפה כלום, אחרי שמחקו את השורות הכפולות שנוצרו בטעינה הראשונה.
3. אחרי שינוי שם מוצר 1 מ-Chai ל-Chocolate נוצרה שורה חדשה ויש 78 שורות. הרשומה הישנה נסגרה עם EndDate והחדשה נשארה עם EndDate ריק.
4. אחרי שינוי מחיר של מוצר 2 מ-19 ל-21 המוצר מופיע פעמיים, והעמודות StartDate ו-EndDate מראות מה היה תקף ומתי.
שימו לב
1. ההרצה הראשונה נכשלה בגלל שם קובץ שונה ב-Connection, ותוקנה בהתאמת שם הקובץ.
2. ההבדל בין השיטות: עם תאריכים בלבד אפשר לשאול על כל נקודת זמן בעבר. הדובר מציין שהוויזארד לא מאפשר לשלב תאריכים ו-Is Current, ובשיעור הבא מראים איך לשלב.
בסיום אפשר להגדיר ב-SSIS תהליך שדורס חלק מהעמודות ושומר היסטוריה בעמודות אחרות.
השיעור הבא בקורס: SCD - Slowly Changing Dimension - חלק 3

פרקי ההרצאה: SCD - Slowly Changing Dimension - חלק 2

  1. 00:00

    יצירת Package חדש לדמו

  2. 00:55

    Source מקובץ Flat File

  3. 01:52

    חזרה על סוגי ה-SCD

  4. 03:23

    הוספת עמודות Start, End ו-Current

  5. 05:12

    המרת סוגי נתונים עם Data Conversion

  6. 09:09

    אשף ה-SCD ומיפוי העמודות

  7. 10:54

    בחירת Business Key

  8. 12:11

    Fixed, Changing ו-Historical Attributes

תמלול ההרצאה: SCD - Slowly Changing Dimension - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «SCD - Slowly Changing Dimension - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    בדוגמה הבאה אנחנו נראה הדגמה של האובייקט Slowly Change Dimension. לצורך כך אני יוצר כאן פקאג' חדש, נשנה לו את השם, Slowly Change Dimension, ומדובר על דמו אחד ואנחנו נשנה אותו בהתאם לכך.

  2. 00:19

    Slowly Change Dimension, האובייקט הזה נמצא אצלנו ברגע שאנחנו פותחים את Data Flow Task בהעברת נתונים מ-Source ל-Destination, יש לנו אפשרות לעקוב ולבצע ניטור אחר רשומות שהשתנו ולהתנהג בהתאם על פי סוגי ה-Slowly Change Dimension השונים כפי שראינו בשיעור הקודם.

  3. 00:42

    נזרוק לכאן את Data Flow Task על מנת להדגים לעצמנו איזשהו דמו של Slowly Change Dimension. דאבל קליק על מנת להיכנס בפנים. ברגע שאנחנו נכנסים כאן לתוך ה-Slowly Change Dimension, בתוך ה-data flow אנחנו ניקח איזשהו source שממנו אנחנו נעתיק את הנתונים. ה-source יכול להיות אקסל פייל, פלאט פייל, טבלה, משהו מתוך ה-database ותכף נראה איך אנחנו

  4. 01:12

    גם מקנפגים את ה-destination בהתאם. Slowly Change Dimension, לצורך הדוגמה שלנו אנחנו ניצור כאן חיבור לתוך flatfile ולכן אני ניגש, בוחר את הקובץ שאותו אנחנו רוצים למפות, עובר כאן ל-all files, אחר כך את הקובץ שאנחנו מכירים product preview מראה לנו את כל המידע עצמו.

  5. 01:33

    אנחנו שולפים את כל הנתונים מתוך קובץ flat file, קובץ CSV, ואותם אנחנו רוצים לייבא. שנייה לפני שאנחנו מייבאים אותם, כאן אנחנו לקחנו את product CSV. לפני שאנחנו מייבאים אותם אני רוצה להדגים את האובייקט עצמו שהוא נמצא כאן אצלי בתוך ה-common: slowly change dimension.

  6. 01:57

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

  7. 02:14

    זה מה שפחות כרגע מעניין אותי. מה שאותי מעניין זה מצב שבו אנחנו עושים אובר-רייד. שני סוגים כרגע מעניינים אותנו, טייפ 1 וטייפ 2, בהמשך אנחנו נראה גם שימושים של טייפ 3, ב-type 1 אנחנו עושים Override, ב-type 2 אנחנו יוצרים Additional Records, רשומה חדשה שבעצם מכילה את הנתונים החדשים כפי שראינו

  8. 02:38

    בשיעור הקודם. אנחנו יכולים ב-type 1 לדרוס ולא לשמור היסטוריה, ואילו ב-type 2 אנחנו פשוט יוצרים שורה חדשה תוך כדי זה שאנחנו מוסיפים תקורה של שלוש עמודות נוספות, כפי שאתם רואים אותן כאן, קארנט סטארט ואנד כאשר שלושת העמודות הללו מציינות לי מי השורה הנוכחית מי השורה כרגע הנכונה כאשר קארנט זה true או false זה yes

  9. 03:03

    ו-no ואילו שתי העמודות האחרות סטארט ואנד נותנות לי חיווי אודות התאריך נכונות של כל רישומה. נחזור לתוכנית שלנו נסגור את המצגת ולפני שאנחנו מעתיקים את הנתונים לתוך טבלת פרודקס אנחנו צריכים להוסיף איזושהי תקורה למבנה הדאטאבייס.

  10. 03:23

    ובכן טבלת product שלפנינו מכילה כאמור את המבנה הבא SPL product על מנת לקבל את הארכיטקטורה של הטבלה עצמה מה יש בה מה מבנה המטא דאטה שלה מבנה עמודות הם כדלקמן אנחנו רואים שאלו עמודות שהדאטה שמכילה הטבלה אולם אנחנו רוצים להוסיף עמודות נוספות על מנת לתמוך באפשרות של slowly change dimension אנחנו רוצים להוסיף

  11. 03:49

    את העמודות של start end ועמודת current. לתוך טבלת פרודקטס אנחנו נוסיף את העמודות הבאות. סטאר דייט כעמודה שמסוג דייט טיים והיא יכולה לקבל נ"ל.

  12. 04:03

    אלטר טייבל, אז אנחנו נוסיף לתוך טבלת פרודקטס אלטר טייבל, נוסיף את העמודה סטאר דייט שהיא מדייט טייט של דייט טיים ואנחנו נוסיף את העמודה הנוספת שלנו עבור אנד דייט שגם היא תהיה מסוג דייט טיים והיא תקבל עמודת נ"ל.

  13. 04:19

    אנחנו נוסיף עוד עמודה נוספת שהיא תהיה is current. קורנט כאינדיקציה האם מדובר בעמודה הנוכחית שלנו. זו אין צורך שהיא תהיה מסוג של דיי טיים אלא אנחנו נצמן אותה כעמודה של ביט.

  14. 04:38

    אלטר טייבל פרודקט שלוש עמודות אנחנו מוסיפים לטבלת פרודקט נריץ את זה נקבל סקספולי העמודות עצמם מעודכנות ואם נבחן שוב את הטבלה נראה שכרגע לפנינו יש לנו עמודות נוספות סטארט דייט end date ו-ease current, ועכשיו אנחנו ערוכים לעבור ל-SSS ולקנפג את התהליך של ה-slowly

  15. 05:01

    change dimension. כיצד אנחנו עושים זאת? ה-source של הדאטה שלנו הוא מתוך, כפי שאנחנו אמרנו, מתוך הנתונים עצמם שהבנו, מתוך קובץ flat file, קובץ CSV. אנחנו נדרשים, לפני שאנחנו מייבאים את הנתונים, רק לבצע איזושהי המרה על מנת שנוכל להשתמש בהם. מאחר

  16. 05:19

    וכל הנתונים, כשאנחנו מייבאים אותם, כשאני עומד כאן על הקומפוננטה ואני לוחץ show advanced editor על מנת לראות מה הדאטה טייפ של הנתונים שאותם אנחנו מביאים אז כל הנתונים עצמם שימו לב הם מגיעים בפורמט של סטרינג גם הפרודקט איי-די וגם הפרודקט ניים סטרינג וגם הסופלייר איי-די סטרינג קבצי csv יודעים לספק לנו נתונים שהדאטה טייפ שלהם הוא csv בלבד אם אנחנו רוצים לעשות להם המרה

  17. 05:48

    אנחנו נשתמש בדאטה conversion כפי שראינו בסרטונים קודמים Product ID, אנחנו ניצור copy of Product ID, כלומר ניצור עמודה חדשה, וכיוון שאנחנו רוצים ליצור אותה כאינטג'ר, אז הבחירה שלנו כאן תהיה 4 byte signed integer, כמספר אינטג'רי שמכיל 4 בתים. אני מגדיר את

  18. 06:08

    זה לצורך העניין. גם פרודקטים אנחנו צריכים לשנות אותו, מאחר שהוא מגיע לסטרינג, ואילו בטבלת יעד שאליה אנחנו רוצים להכניס אותו, אנחנו מכניסים את זה ל-n ורקר, ל-unicode ורקר, זאת אומרת שאנחנו מכניסים את זה לשתי בתים, תו ולא לבית אחד לא לקוד אסקי אלא ליוניקוד ולכן צריך לעשות את השינוי כאן בדאטה קונברז'ן

  19. 06:31

    ליוניקוד סטרינג. כנ"ל לגבי סופלייר איידי אני מסמן אותו עומד כאן בוחר שוב פעם סופלייר איידי אם נסתכל לאן אנחנו מכניסים אותו גם את סופלייר איידי וגם את קטגורי איידי אנחנו מכניסים לשדה מסוג אינטג'ר ולכן אנחנו נעביר אותו למה שמקביל כאן לאינטג'ר שזה 4 בייט סיינד אינטג'ר אז גם ל-supplier, גם לקטגורי 4-byte-signed-integer,

  20. 06:58

    Quantity Per Units, רק צריך לבדוק מה אנחנו רוצים לעשות כאן. Quantity Per Units זהו שדה מכרוזתי, Unicode, וזה בדיוק מה שאנחנו צריכים לעשות בהמרה שלנו כאן.

  21. 07:10

    אז ב-Quantity Per Units אנחנו נמיר אותו לשדה מסוג Unicode String. נתקדם הלאה, Unit Price זה Money, ועוד שלושת השדות שלאחר מכן, יוניטין סטוק און אורדר וריאורדר לבל הם סמול אינטג'ר מה שאומר שזה לא ארבעה בתים אלא סמול אינט אלא שתי בתים.

  22. 07:32

    אז ראשית נעביר את ה-unit price להיות money וה-unit price שלנו כ-money זה ה-currency זה המקבילה שלו ושלושת העמודות הללו יוניטין סטוק יוניטין אורדר וריאורדר לבל את שלושתם אנחנו מעבירים לא ל-4 בייט סיינט אינטג'ר לא לאינטג'ר לארבעה בתים אלא לשתי בתים, שתי בתים מבחינתנו זה לבחור כאן את השדה שמכיל שתי בתים Ui2,

  23. 08:03

    Ui2 הנה זה 2 byte signed integer אנחנו נעשה את זה בשניהם 2 byte signed integer ו-2 byte signed integer שתי בתים שזה המקבילה של small אינטג'ר נותר לנו דבר אחרון שזה הדיסקונטיניו והדיסקונטיניו הוא מסוג של ביט.

  24. 08:24

    בביט אנחנו יכולים להשתמש בערך אקוויוולנטי שלנו שזה יהיה הבוליין. אז עשינו כאן המראה אז מכאן ואילך אנחנו כבר לא עובדים על הצדות המקוריים שאותם קיבלנו על ה input column אלא אנחנו נעבוד על הoutput alias הכינוי החדש שאותו אנחנו נתנו.

  25. 08:46

    הם אלו השדות שאיתם אנחנו נתקדם קדימה. את כל המידע הזה אנחנו שופכים אותו ל-Slowly Change Dimension. עכשיו אנחנו רוצים להכניס נתונים חדשים לתוך טבלת Products, אחרי שביצענו המרה לנתונים מתוך הקובץ CSV, אבל אנחנו רוצים להיות רגישים ל-Changing.

  26. 09:07

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

  27. 09:33

    את הצ'יינג'ינג של הדאטה ולכן הוא שואל אותי מהו הדיימנשן טייבל מהו טבלת היעד שהוא מניח שהיא דיימנשנס אבל זה לאו דווקא מהו טבלת יעד שאליה אתה רוצה ולייבא את הנתונים, במקרה שלנו אנחנו רוצים להביא את זה לתוך טבלת Products, כל מה שנותר לי זה רק לבחור את הטבלה, וממילא הוא מסמן לי את שמות כל העמודות הרלוונטיות באותה טבלה,

  28. 09:56

    Category ID, Discontinue, End Date, Ease Current, Product ID, הוא מסמן לי את שמות כל העמודות, ואני בהתאמה יכול לעשות את המצ'ינג ביניהם. אנחנו לא רוצים לעשות את המצ'ינג לפי השם, כי אנחנו לא רוצים להכניס את Product ID מאחר וראינו שהוא מגיע בפורמט שונה שלא מתאים לטבלת יעד,

  29. 10:18

    אלא אנחנו נעבור שדה שדה וניקח את המקבילו. תחת השלג Category ID ניקח את copy of Category ID, ובמקום discontinue ניקח את copy of discontinue.

  30. 10:29

    End date ו-is current לא הבאנו אותם, אז אין לנו מה לגעת בהם. Product ID, אז אנחנו לוקחים את ה-copy of Product ID.

  31. 10:36

    כנ"ל לגבי Product Name, אנחנו לא ניקח את ה-Product Name עצמו, אלא copy of Product Name. כנ"ל לגבי כל שאר העמודות, Quantity Per Units, Reorder Level, Start Date זו עמודה שאנחנו לא מייבאים אותה, אחת משלושת העמודות תקורה שבהן אנחנו נשתמש על מנת לנטר את התהליך

  32. 10:54

    ולהכניס שינויים בהתאם לשינויים שנעשו. אז עשינו כאן מיפוי, ולמטה צועק לי ה-SSIS: At least one business key needs to be selected.

  33. 11:05

    כדי לזהות רשומה בצורה חד-חד-ערכית אני חייב שתהיה לי עמודה אחת, שלא כל העמודות יהיו מסומנות כ-not-a-key column, אלא אני חייב שאחת מהן תהיה מפתח, כמובן שמי שמפתח אצלנו זה ה-product ID, ורק בו אני הולך ומסמן business scheme.

  34. 11:23

    אז יש לנו מיפוי שלם של כל העמודות, אנחנו גם מצליחים לעשות מיפוי ברמת ה-data type, אם לא היינו עושים את ה-data conversion לא היינו מצליחים לעשות מיפוי בין השדות כלת, בין ה-source לדסטיליישן.

  35. 11:35

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

  36. 11:47

    המסך הבא מחזיר אותנו, שימו לב כאן, טייפ 1, טייפ 2. מחזיר אותנו למצגת שבה ראינו מה ההבדלים בין טייפ 1 לטייפ 2. היכולת שלנו או לעשות אובריי או לעשות Additional New Records, ליצור רשומה חדשה.

  37. 12:08

    זה בדיוק מה שאני נדרש לבצע כאן. אני ממליץ לשבת ולקרוא את שלושת האפשרויות הרשומות כאן מצד שמאל. ו-Fixed Attributes זה היכולת שלנו בעצם למנוע העתקה.

  38. 12:21

    כלומר, לא לאפשר שתהיה העתקה. עבור כל שדה, שימו לב אני לוחץ כאן, נפתחת לי רשומה חדשה עם השדה החדש. עבור כל שדה אני יכול לבחור אחת ממי האפשרויות הבאות.

  39. 12:35

    עבור Category ID אני יכול להחליט או שזה Fixed, או שזה Changing, או שזה Historical. בהתאמה, או שזה טייפ אפס, לא מאפשרים שינוי.

  40. 12:48

    Select this type, קראו איתי כאן בצד השמאל להסבר המופלא, שהוא בדיוק מחזיר אותנו להסבר שהיינו במצגת. When value column should not change, בדיוק כמו שראינו במצגת, כאשר הערך איננו יכול להשתנות, changing is treated as error.

  41. 13:07

    כלומר, אנחנו מקבלים כאן שגיאה, זה בדיוק המצב שבו אנחנו לא מאפשרים שינוי. האם אנחנו רוצים שכל העמודות שלנו יהיו Fixed Attributes?

  42. 13:17

    יכול להיות שכן. בדוגמה שלנו אנחנו נבחר שלא כך, אלא אנחנו רוצים לשנות אותם. לאן אנחנו רוצים לשנות אותם? אז יש לנו שתי אפשרויות: או פשוט לדרוס את השינוי, Changing, או לשמור היסטוריה של הערכים.

  43. 13:34

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

  44. 14:01

    לדוגמה product name אולי נכון לי גם לשמור את שם המוצר לאורך ההיסטוריה היסטוריקל אטריבוט כלומר לא רק לשמור לדרוס ולאפשר שינוי כפי שמאפשר לנו טייפ אחד אלא לשמור היסטוריה של השינויים ועל מנת לדעת לחזור בכל רגע נתון לכל שלב בהתפלגות ההיסטורית לדעת מה היה שם המוצר ואנחנו נבחר גם את

  45. 14:26

    unit price לצורך כך על מנת לדעת מה היה המחיר לאורך ההיסטוריה כולה. הנה הרי לפנינו שאנחנו בתהליך שבו יצרנו עומק תלת מימד לטבלה.

  46. 14:39

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

  47. 14:57

    רק לצורך הדוגמה, אני אקח כאן אחת העמודות, את העמודת Uniting

לקורס המלא: קורס SSIS אונליין

ההרצאה הקודמת: SCD - Slowly Changing Dimension - חלק 1

ההרצאה הבאה: SCD - Slowly Changing Dimension - חלק 3

הרצאות קשורות מקורסים אחרים

  • Dimension Resource

קורסים נוספים במסלול

  • קורס DBA אפליקטיבי - שפת SQL למתחילים
  • קורס NoSQL - MongoDB
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI