Skip to content

פונקציות חלון ב־SQL מוסברות

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

פונקציית חלון מחשבת תוצאה על פני שורות הקשורות לשורה הנוכחית, בלי לכווץ אותן כמו ש־GROUP BY עושה. כל פונקציית חלון מסתיימת בסעיף OVER שמגדיר את החלון: PARTITION BY מקבץ שורות, ORDER BY מסדר אותן, והמסגרת האופציונלית תוחמת את הקבוצה הנעה. שולטים ב־OVER — והשאר הוא אוצר מילים.

טבלת עיון · 27 ערכים
27 of 27 rows
דירוג
מספר שלם עוקב וייחודי לכל שורה בתוך החלון.ROW_NUMBER() OVER (ORDER BY total DESC)
דירוג עם רווחים; שורות שוות חולקות דירוג והמספרים הבאים מדולגים.RANK() OVER (ORDER BY total DESC)
דירוג בלי רווחים; שורות שוות חולקות דירוג ושום דבר לא מדולג.DENSE_RANK() OVER (ORDER BY total DESC)
מפצל את החלון הממוין ל־n קבוצות שוות בערך.NTILE(4) OVER (ORDER BY total DESC)
הצצה לשורות שכנות
ערך מ־n שורות אחורה; ערך ברירת המחדל מחליף אותו כשאין שורה כזאת.LAG(total, 1, 0) OVER (ORDER BY created_at)
ערך מ־n שורות קדימה; ערך ברירת המחדל מחליף אותו כשאין שורה כזאת.LEAD(total, 1, 0) OVER (ORDER BY created_at)
צבירה על פני חלון
סכום רץ או לפי מחיצה בלי לכווץ שורות.SUM(total) OVER (ORDER BY created_at)
ממוצע רץ או לפי מחיצה.AVG(total) OVER (PARTITION BY user_id)
ספירת שורות רצה או לפי מחיצה.COUNT(*) OVER (PARTITION BY user_id)
הערך הנמוך ביותר על פני החלון או המחיצה.MIN(total) OVER (PARTITION BY user_id)
הערך הגבוה ביותר על פני החלון או המחיצה.MAX(total) OVER (PARTITION BY user_id)
SUM עם ORDER BY ומסגרת פתוחה מההתחלה; כל שורה מסכמת את כל מה שעד אליה.SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG על מסגרת של n שורות לפני ואחרי השורה הנוכחית.AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
ראשון, אחרון ואחוזונים
הערך הראשון בסדר של החלון.FIRST_VALUE(total) OVER (ORDER BY total DESC)
הערך האחרון במסגרת; בלי UNBOUNDED FOLLOWING המסגרת נעצרת בשורה הנוכחית.LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
הערך בשורה ה־n של סדר החלון.NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
הדירוג היחסי של שורה, מ־0 עד 1.PERCENT_RANK() OVER (ORDER BY total)
חלק השורות שבשורה הנוכחית או לפניה, מ־1/n עד 1.CUME_DIST() OVER (ORDER BY total)
סעיף ה־OVER
מגדיר את החלון שכל פונקציה קוראת.<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
מתחיל את החלון מחדש לכל קבוצת שורות.PARTITION BY user_id
מסדר שורות בתוך כל מחיצה.ORDER BY created_at
תוחם את המסגרת הנעה, למשל משורות קודמות לשורות באות.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
תוחם את המסגרת לפי ערכים ולא לפי מיקומי שורות; CURRENT ROW כולל שורות שוות ערך, וזו מסגרת ברירת המחדל תחת ORDER BY.RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
תוחם את המסגרת לפי קבוצות של שורות שוות ערך מה־ORDER BY.GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
מסיר את השורה הנוכחית מהמסגרת; EXCLUDE TIES מסיר במקום זאת את השווים לה.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
נותן שם לחלון פעם אחת בשאילתה כדי שמספר סעיפי OVER יוכלו לעשות בו שימוש חוזר.WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
מצמצם את השורות שצבירת חלון קוראת, לפני החלת החלון.SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)