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

LAG, LEAD וסיכומים שוטפים

LAG ו-LEAD הן שתי פונקציות חלון מיוחדות המעניקות לך גישה אל שורות אחרות של אותה מחיצה: השורה הקודמת (LAG) או הבא (LEAD) לפי ה-ORDER BY של החלון. הם ה כלי go-to עבור השוואות שורה לשורה (דלתות, וריאציות, מרווחים) ו - בשילוב עם SUM/AVG/COUNT OVER - עבור סיכומים שוטפים.

LAG: השורה הקודמת

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

דוגמה: עבור כל הזמנה, "ימים מאז ההזמנה הקודמת באותה מידה לקוח":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

בהזמנה הראשונה של כל לקוח יש since_previous_order = NULL בגלל אין "קודם" במחיצה.

LEAD: השורה הבאה

המראה של LAG. טיפוסי: "זמן עד לאירוע הבא", "הבדל עם הגרסה הבאה".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

סיכומים רצים: נצברים עם OVER

פונקציות מצטברות (SUM, AVG, COUNT, MAX, MIN) הופכות מצטבר בשילוב עם OVER (… ORDER BY …):

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

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

נסה את זה

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

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

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

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at) מחזירה את חותמת הזמן של ההזמנה הקודמת של הלקוח. יש להחסיר כדי לקבל INTERVAL, ואז להמיר לימים.

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

סקירת התרגיל

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

עבור כל הזמנה שנמסרה (סטטוס = 'מסירה'), הצג את id, customer_id, ordered_at, order_total (סכום כמות *מחיר_יחידה של פריטי השורה שלה) ו-running_total (סה"כ רץ של הסכומים ללקוח, בהזמנה לפי ordered_at). השתמש ב-CTE עבור order_total. הזמינו לפי זיהוי_לקוח והזמנה_ב-.

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

ה-CTE מחשב את הסכום הכולל לכל הזמנה; ה-SUM OVER מייצר את הסכום השוטף ללקוח לאורך זמן.

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