המדריך נכתב על ידי יובל מרנין.
למידע על שרותי מנטורינג של דאטה אנליסט לחצו כאן.
בפרק זה נלמד על הוראת Group by והוראת Having בשפת SQL.
ב- שפת SQL פונקציות אגרגטיביות הופכות את כל השאילתה לאגרגטיבית. אם נרצה לקבץ את הטבלה האגרגטיבית בעזרת אחד השדות נשתמש בהוראה group by.
לדוגמה:
select
seller_id,
count(order_id) as order_items, — count of ordered items
count(distinct order_id) as orders, — count of orders
count(order_id)::float / count(distinct order_id)::float as avg_items_for_orders, — average number of orders
count(distinct seller_id ) as selers, — number of unique orders
sum(price) as sum_of_orders, — sum of orders
avg(price) as avg_item_price, — average item price
sum(case when shipping_limit_date::date='2017-09-19' then 1 else 0 end ) as sum_of_orders_09_19, — number of items ordered in 19 sep 2019 max(price) as max_amt -–- maximum price item price
from
order_items
Group by
seller_id
בדוגמה הנ"ל לקחנו את את השאילתה מהפרק הקודם וחילקנו אותה לפי מוכרים בעזרת שדה seller_id. שדה זה גם מופיע לאתר הוראת ה – group by.
הערות לכתיבת שאילתה אגרגטיבית:
- בראש השאילתה רצוי שיופיע השדה שלפיו מקבצים את הטבלה (seller_id) כדי שבפלט נדע למה הערכים האגרגרטיבים מתייחסים.
- בעת אגרגציה ניתן להשתמש באזור ה- select רק בשדה שעושים לפיו אגרגציה או בפונקציות אגרגטיביות
- ניתן גם לבצע אגרגציה גם לפי מספר שדות. למשל:
select
seller_id,
shipping_limit_date::date as shipping_limit_date,
count(order_id) as order_items –- number of items ordered
from
order_items
Group by
seller_id,
shipping_limit_date::date
שיטת כתיבה נוספת לרשום את בשדות שלפיהם מבצעים את ה-group by היא לפי מספר העמודה של שהשדה מופיע באזור ה- select (שימו לב שעלולים להיות דאטה ביסים שלא תומכים באופן כתיבה זה):
select
seller_id,
shipping_limit_date::date as shipping_limit_date,
count(order_id) as order_items — number of items ordered
from
order_items
Group by
1,2
order by
1,2
סינון על נתונים אגרגטיבים בשאילתה בעזרת Having
בשפת SQL ישנה אפשרות לבצע סינון על שדות לאחר התוצאה של האגרגציה.
סינון כזה מבוצע בעזרת הוראת having.
select
seller_id,
count(order_id) as order_items — number of items ordered
from
order_items
Group by
seller_id
having
count(order_id)>100
בשאילתה הזאת קיבלנו את המוכרים שמכרו יותר מ 100 פריטים.
שימו לב שיש לכתוב את הפונקציה שלפיה אנחנו מסננים בהוראת having.
ההבדל בין Where ל- Having
בהוראת where נשתמש לפני ביצוע האגרגציה – אם למשל נרצה לסנן את לקוחות מסוימים שאנחנו לא רוצים להכליל בשאילתה, ואילו בהוראת having נשתמש כאשר נרצה לסנן שורות מהתוצאה של המשתנים האגרגטיבים,
ניתן בשאילתה אחת להשתמש גם בהוראת having וגם ב- where.
כאשר משתמשים בשני ההוראות, הוראת ה – whereתופיע לפני הוראות ה– group by וה – having. זאת כיוון שהדטה-בייס מסנן קודם השורות בטבלה בעזרת where ורק אח"כ מבצע את אגרגציה.
select
seller_id,
count(order_id) as order_items — number of items ordered
from
order_items
where
shipping_limit_date::date='2017-09-19'
Group by
seller_id
having
count(order_id)>3
תרגול שפת SQL
באתר strata scratch תמצאו תרגילים רבים עם שאלות עסקיות מורכבות, וממשק המאפשר כתיבה והרצה של שאילתות כך שתוכלו לבדוק האם הפתרון שלכם נכון. באתר יש גם אפשרות לתרגל תרגילים ב- Python.
התרגול באתר הוא ללא עלות, אך אפשר להירשם כדי לקבל גישה לתרגילים חדשים ופתרונות לכל התרגילים (גילוי נאות – רישום לאתר דרך הקישור מתגמל אותי בעמלה קטנה, וגולשים המגיעים דרך הקישור יכולים להשתמש בקוד קופון yuval20 על מנת לקבל 20% הנחה).
נכתב על ידי יובל מרנין,
לשרותי ניתוח נתונים ויצירת דוחות BI ניתן לפנות אליי ב- לינקדאין, פייסבוק או במייל: [email protected]
*** לפודקאסט של הבלוג לחצו כאן ***
פרק הבא – פרק 10: תתי שאילתות