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

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

לעתים מזומנות אנו צריכים להציג או לסנן מקסימום או מינימום של ערכים באמצעות שאילתת SQL ו\או כלים אוטומטים.

 

לדוגמא: בוא נניח שישנה טבלה המכילה:

 

קוד סוכן: agent_num

 

תאריך מכירה: sales_date

 

סכום מכירה: sales_sum

 

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

 

אם נתפתה ונבצע שאילתא SQL סטנדרטית, כגון:

 

 

נקבל תוצאה דומה או אפילו לזהה ל select * from table והסיבה לכך נעוצה בכך שה group by  במשפט הSQL ייקבץ את ה max  ביחס לכל צירוף של agent_num, sales num או בקיצור לכל שורה. בקיצור, יש לחפש את הישועה בשיטה אחרת לחלוטין.

 

שיטה א

 

בוא ניצור טבלה אמיתית באמצעות גזירה או וירטואלית כגון view או derived table שהנתונים בה יהיו הSQL הבא:

 

 

 

בוא נכנה טבלה זאת max_date_view.

 

כעת, יש לנו למעשה "יישות" שונה מבחינת SQL שמכילה לכל סוכן את תאריך המכירה האחרון שלו.

 

אם נחבר את הטבלה המקורית (table) ל max_date_view באמצעות join רגיל, כגון:

 

 

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

 

שיטה ב

 

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

 

השיטה אומרת: במקום שניצור טבלה או view, ניצור טבלה בתוך השאילתא באמצעות alias.

 

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

 

 

לאחר מכן, נוסיף חלק נוסף:

 

\

 

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

 

 Where table_alias.agent_num=table.agent_num

 

לאחר שקיבלנו תאריך מקסימלי השוונו אותו לtable באמצעות(שאילתא פנימית Where sales_date=(