PracticU

מילוי ערכים בטבלת Dimension

בלי כתוביותעם כתוביות
PracticU › קורס SSIS › מילוי ערכים בטבלת Dimension
מילון מושגים:
סקריפט - קובץ המכיל רצף פקודות שמבוצעות על ידי מפרש, לרוב כדי להפוך משימות לאוטומטיות.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
Northwind - מסד נתונים לדוגמה של מיקרוסופט, המדמה חברת מסחר ומשמש ללימוד ולהדגמת שאילתות SQL.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.

מילוי ערכים בטבלת Dimension
מילוי טבלת Dimensions.Date בסקריפט, עם פונקציות SQL לכל עמודה, ופתרון לשתי עמודות שאין להן פונקציה מובנית: היום ברבעון והשבוע בחודש.
טווח התאריכים והלולאה
1. תאריך התחלה: המינימום של OrderDate מהטבלה Orders במסד התפעולי Northwind.
2. תאריך סיום: GETDATE().
3. הלולאה: while כל עוד תאריך ההתחלה קטן או שווה לתאריך הסיום. בכל סיבוב מכניסים שורה ואז מקדמים יום עם DATEADD ברזולוציה dd.
4. העמודה האוטומטית: מפתח ה-identity לא מוזן.
חישוב העמודות
1. שדות המחרוזת: CONVERT ל-char(10) עם סגנון 103 לפורמט UK, ועם 101 לפורמט האמריקאי.
2. חלקי תאריך: חודש (מספר), שם חודש עם DATENAME, יום בחודש עם DAY, שנה עם YEAR, ויום בשנה, יום בשבוע ורבעון עם DATEPART (עם dy, dw ו-qq). שם היום בשבוע נלקח עם DATENAME ו-dw.
3. יום ברבעון: אין לכך פונקציה. מחשבים את מספר הרבעונים מאפס עד התאריך עם DATEDIFF, מוסיפים אותם לאפס עם DATEADD כדי לקבל את היום הראשון של הרבעון, ומחשבים את ההפרש בימים בינו לבין התאריך. מוסיפים 1, כי החישוב מתחיל מאפס.
4. שבוע בחודש: גם לכך אין פונקציה. חודש יכול להתפרס על עד שישה שבועות, למשל פברואר 2021 על חמישה, וינואר על שישה. מחשבים את מספר השבוע בשנה של התאריך, פחות מספר השבוע בשנה של היום הראשון בחודש, ועוד 1. היום הראשון נבנה עם CONCAT של חודש, יום 01 ושנה, ועם CAST ל-datetime. הבדיקה כיסתה קצה בחודש פברואר: 7 מתחיל שבוע שני, 14 שלישי, 28 בחמישי.
5. פורמט חודש ושנה: שרשור של החודש עם 0 בתחילתו, ואז RIGHT של שני תווים כדי לקבל שתי ספרות, ועוד שנה בארבע ספרות. הגרסה הראשונה שלקחה LEFT נתנה תוצאה שגויה בחודש 10, ולכן עברו ל-RIGHT.
6. שולבו הכול בסקריפט אחד: את המשתנים שבדוגמאות מחליפים ב-@d, כך שהחישוב עובד בשורה אחת של insert.
שימו לב
1. המטרה בשמירת הווריאציות בטבלה היא שלא יהיה צורך להמיר או לחשב בזמן השליפה.
2. האם אפשר לחשב אותם בשאילתה? כן, אבל אז המשתמש יצטרך לבצע מניפולציה בכל שליפה.
אחרי ההרצאה הטבלה ממולאת מתאריך המכירה הראשון עד היום, בכל הפורמטים, ומוכנה לשימוש.
השיעור הבא בקורס: יצירת סכמה עבור Data Warehouse

פרקי ההרצאה: מילוי ערכים בטבלת Dimension

  1. 00:00

    סקריפט למילוי טבלת Dates

  2. 00:55

    תאריך סיום ולולאת קידום יום

  3. 02:13

    רשימת העמודות ל-Insert

  4. 03:07

    למה לשמור וריאציות של תאריך

  5. 04:05

    המרת פורמטים עם CONVERT

  6. 05:21

    חלקי התאריך עם DATENAME ו-DATEPART

  7. 08:13

    חישוב היום ברבעון

  8. 12:17

    האתגר של מספר השבוע בחודש

תמלול ההרצאה: מילוי ערכים בטבלת Dimension

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

  1. 00:02

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

  2. 00:20

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

  3. 00:49

    מינימום orderDate from orders אבל אנחנו רוצים לשלוף את זה מתוך הדאטאביס ה-Operational מתוך Northwind אז נכתוב זאת על ידי ציון מפורש שאנחנו שולפים את orderDate From לונפווינג נקודה נקודה orders. עד כאן קבענו מהי נקודת ההתחלה.

  4. 01:08

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

  5. 01:31

    מהתאריך האחרון שלנו שהוא ה-end date. כל עוד הוא קטן או שווה אנחנו נבצע כאן איזשהו insert, איזושהי מניפולציה, ונקדם את התאריך שלנו, נקדם אותו ביום אחד קדימה ל-date add שאנחנו מוסיפים לו רזולוציה של יום אחד אז זה dd.1 מוסיפים יום לתאריך עצמו ואת זה אנחנו מכניסים בחזרה לתוך המשתנה וכך יש

  6. 02:00

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

  7. 02:22

    נפתח את העמודות הרלוונטיות ונתחיל לכתוב את השמות שלהם. אז בעצם את ה-dead s k אותו אין לנו מה למלא והוא יתמלא בצורה אוטומטית מאחר והוא העמודה של ה-identity אז אותו אנחנו לא ממלאים. בואו נכתוב כאן את כל שאר העמודות.

  8. 02:38

    full k, months name שלנו, יום של החודש, day of months, year num שאותו יצרנו, day of year, sick, day of week num, כך גם את השדה עצמו כאן, name quarter, נעבור

  9. 02:56

    ל-quarter num ו-quarter day of quarter שלנו, לאחר מכן ל-יום בחודש, ופורמטים שונים, בחרנו לעסוק בפורמט הזה, אבל כמובן שאפשר להוסיף כל פורמט אפשרי.

  10. 03:11

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

  11. 03:23

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

  12. 03:49

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

  13. 04:02

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

  14. 04:22

    הפורמט שאיתו אנחנו רוצים לעבוד מאחר ואנחנו כאן מדברים על העמודה עצמה של uk אז אנחנו נכתוב את זה בהמרה של שדה convert מעניין לראות אם נפתח כאן את הביטוי של convert נראה שיש לה מספר פורמטים ואם אנחנו רוצים לדעת מה קורה ב uk מה קורה בפורמט שהוא d months וyear אנחנו צריכים לקחת את 103 זה בדיוק מה שאנחנו

  15. 04:50

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

  16. 05:17

    אם נגיע לכך, כרגע אנחנו נמצאים בשדה של ה-Mנס-נאם, איזה חודש אנחנו מדברים אז זה מאוד פשוט אנחנו רוצים את הסטאר דייט שלנו לקבל את החודש בעצמו נתקדם לשורה הבאה אם אני רוצה את ה-month name לקבל את ה-month name יש לנו פונקציה שנקראת date name שיודעת לקבל לנו את המשתנה עצמו מה אנחנו רוצים לקבל אז אנחנו רוצים לקבל בעצם את החודש זה החלק שלנו

  17. 05:47

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

  18. 06:19

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

  19. 06:33

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

  20. 06:53

    אז כמו שיש לנו את החודש, את היום, day of year, היום בחודש, אז אותו אנחנו מייצגים על ידי האותיות dy וזה בדיוק מה שאנחנו נעשה כאן.

  21. 07:05

    Day of year, היום בשנה שלנו, אנחנו רוצים day of week, day of week מאוד דומה לפורמט הזה, גם כאן אנחנו רוצים date part, אנחנו רוצים אותו במספר, ובמקום לקבל dy אנחנו לוקחים dw.

  22. 07:24

    Day of Week. אבל אם אנחנו רוצים את ה-Day of Week Name, אז זה כבר לא Date Part, אלא זה Date Name. וכאן גם אנחנו רוצים את ה-DW ולאחר מכן את ה-Start Date.

  23. 07:38

    Day of Week Name, היום בשבוע. Sunday, Monday, Tuesday, Friday וכו' וכו'. Quarter, אם אני רוצה לקבל את ה-Quarter, זה ממש לקבל פארט מתוך התאריך עצמו, ולכן אני משתמש בפארט, אבל תחת בקשה של day year אני אבקש כאן qq מהו הday of quarter אם נסתכל כאן בתוך הבקשה שלנו ונראה שיש לנו כאן את הquarter בעצמו עבור שליפת

  24. 08:05

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

  25. 08:25

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

  26. 08:51

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

  27. 09:08

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

  28. 09:21

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

  29. 09:36

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

  30. 09:58

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

  31. 10:13

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

  32. 10:26

    כדי למצוא את שני התאריכים הללו, אז תאריך אחד יש לי, זה ה-X שבו אני נמצא. תאריך שני זה בעצם תחילת הרבעון. איך אני אמצא מהו תחילת הרבעון?

  33. 10:37

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

  34. 10:46

    כדי למצוא באיזה רבעון אני נמצא, כמה רבעונים עברתי, אז זה בעצם דייט דיף. אני רוצה לדעת מה ההפרש מבחינת רבעונים בין 0 ובין הרבעון הנוכחי שלי, שזה ה-Start Date.

  35. 11:03

    זה בעצם ההפרש ביניהם. את ההפרש הזה אני רוצה להוסיף לנקודת ההתחלה שלנו, ל-0. Date Add, QQ, כמה אני רוצה להוסיף את כל זה, למי אני רוצה להוסיף לתחילת שנה בעצם ל-0 הזה, ל-0 שמבחינתנו שזה תחילת שנה.

  36. 11:23

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

  37. 11:47

    עד כאן ביצענו בעצם את הפקודה שבה אנחנו רוצים לדעת באיזה יום בחודש אנחנו נמצאים. מאחר ועשינו זאת וקיבלנו חיסור החל מהאפס, אז אנחנו נקבל כאן יום אחד פחות, ולכן כדי לקדם אותו אז אנחנו נוסיף עוד פלוס, וזה מה שייתן לנו את ה-day of quarter.

  38. 12:09

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

  39. 12:29

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

  40. 12:40

    אני יכול לקבל את מספר היום באותו שבוע, אבל אני לא יכול לקבל את מה שכרגע אני מבקש לדעת, Week of Month, את מספר השבוע בתוך החודש הנוכחי.

  41. 12:51

    בואו נפתח רגע מערכת זמנים ונסתכל על הלוח שנה שלנו. בלוח שנה, כשאני מסתכל על חודש פברואר 2021 לצורך הדוגמה, חודש פברואר מתפרס לי על פני 1, 2, 3, 4 שבועות.

  42. 13:09

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

  43. 13:33

    השביעי לחודש הוא כבר בשבוע השני לחודש. בואו נסתכל על תאריך נוסף, על חודש נוסף.

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

ההרצאה הקודמת: יצירת Dimension של תאריך

ההרצאה הבאה: יצירת סכמה עבור Data Warehouse

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

  • החזרת ערכים מה-Controller
  • Dimension Resource

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

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