שיעורי מודול (4/4)
משמרות: LAG ו-LEAD
משמרות: LAG ו-LEAD
בנתונים עוקבים ומבוססי זמן, לעתים קרובות עליך להשוות את השורה הנוכחית לזו מהיום הקודם. ב-SQL "סטנדרטי", לעשות זאת דורש הצטרפות עצמית מסוכנת מאוד (ואיטי מאוד).
הפונקציות LAG() (השורה הקודמת) וLEAD() (השורה הבאה) פותרות בדיוק את הבעיה הזו בזריזות ואלגנטיות קיצונית.
מבט לעבר ולעתיד
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;בדוגמה, כל שורה תישא בצורה נוחה את הכמות המיוצרת על ידי אותה טבלה, מוזז קדימה בשורה אחת (אחורה בזמן). אנחנו יכולים בקלות להחסיר את total_amount - LAG(...) כדי לחשב את ההפרש או השינויים באחוזים מחודש לחודש!
באופן דומה, LEAD() ימשוך את הערך מהשורה שמתחת לזו הנוכחית.
מטבלת 'מוצרים', חלץ 'id', 'launched_on', 'price' והוסף 'prev_price', כלומר ה'מחיר' של המוצר שנחשב באופן הגיוני ל'קודם', בסדר עולה של 'launched_on'.
הצג רמז
השתמש ב-LAG(price) OVER(ORDER BY launched_on ASC)
הפתרון זמין לאחר 3 ניסיונות
כיצד היית מחשב את קפיצות הדירוג לכל משתמש בודד? הדמיית אותו: מטבלת 'ביקורות' חלץ 'מזהה_לקוח', 'יוצר_ב', 'דירוג' ו-'דירוג_הבא' (הסקירה הבאה של אותו לקוח לאורך זמן). אז חלקו לפי 'customer_id', הזמינו לפי 'created_at' והשתמשו בפונקציית החלון הימנית כדי להציץ קדימה.
הצג רמז
LEAD() יחד עם PARTITION BY ו-ORDER BY ב-OVER.
הפתרון זמין לאחר 3 ניסיונות