דילוג לתוכן המרכזי
מודול 13 · שיעור 4 מתוך 452/57 בקורס~12 min
שיעורי מודול (4/4)

משמרות: LAG ו-LEAD

משמרות: LAG ו-LEAD

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

הפונקציות LAG() (השורה הקודמת) וLEAD() (השורה הבאה) פותרות בדיוק את הבעיה הזו בזריזות ואלגנטיות קיצונית.

מבט לעבר ולעתיד

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

בדוגמה, כל שורה תישא בצורה נוחה את הכמות המיוצרת על ידי אותה טבלה, מוזז קדימה בשורה אחת (אחורה בזמן). אנחנו יכולים בקלות להחסיר את total_amount - LAG(...) כדי לחשב את ההפרש או השינויים באחוזים מחודש לחודש!

באופן דומה, LEAD() ימשוך את הערך מהשורה שמתחת לזו הנוכחית.

פעילות גופנית#sql.m13.l4.e1
ניסיונות: 0טוען...

מטבלת 'מוצרים', חלץ 'id', 'launched_on', 'price' והוסף 'prev_price', כלומר ה'מחיר' של המוצר שנחשב באופן הגיוני ל'קודם', בסדר עולה של 'launched_on'.

טוען עורך...
הצג רמז

השתמש ב-LAG(price) OVER(ORDER BY launched_on ASC)

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#sql.m13.l4.e2
ניסיונות: 0טוען...

כיצד היית מחשב את קפיצות הדירוג לכל משתמש בודד? הדמיית אותו: מטבלת 'ביקורות' חלץ 'מזהה_לקוח', 'יוצר_ב', 'דירוג' ו-'דירוג_הבא' (הסקירה הבאה של אותו לקוח לאורך זמן). אז חלקו לפי 'customer_id', הזמינו לפי 'created_at' והשתמשו בפונקציית החלון הימנית כדי להציץ קדימה.

טוען עורך...
הצג רמז

LEAD() יחד עם PARTITION BY ו-ORDER BY ב-OVER.

הפתרון זמין לאחר 3 ניסיונות