קריטריון ROWS ו־RANGE
שיעור 12 מתוך 13 בקורס SQL למתקדמים של Coddy.
נכון לעכשיו, איננו יכולים להיות גמישים בבחירת מספר השורות שלפני או אחרי שיש להביא בחשבון. כעת אפשר לעשות זאת באמצעות הקריטריונים ROWS ו־RANGE. כדי להשתמש בהם, נכתוב:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
ונוכל לציין את האפשרויות הבאות:
CURRENT ROW- השורה הנוכחיתn PRECEDING- שורות שלפני השורה הנוכחיתn FOLLOWING- שורות שאחרי השורה הנוכחית
ההבדל בין ROWS ל־RANGE הוא שהקריטריון ROWS אינו מתחשב בערכים, אלא רק במיקומים, ואילו RANGE מגדיר את החלון לפי טווחי ערכים ולא לפי מיקומי השורות.
עבור RANGE חובה לציין ORDER BY --column_name--, כי אחרת הוא לא ידע כיצד לבחור את החלון.
לדוגמה:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGכאן נוצר חלון שכולל את השורה הנוכחית, את השורה שלפניה ואת השורה שאחריה.
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levelsכאן נוצר חלון שכולל עבור כל רמה (בסדר עולה) את הרמה הנוכחית, רמה אחת לפניה ורמה אחת אחריה. אם הרמה הנוכחית היא 5, הוא יכלול את הרמות 4, 5 ו־6.
הערה: השימוש ב־RANGE BETWEEN עשוי לגרום לכך שייכללו בחלון שלך יותר שורות, משום שהוא כולל את כל השורות שחולקות את אותם ערכים כמו הערכים שבטווח, ואילו ROWS BETWEEN יכלול תמיד את אותו מספר שורות (כל עוד הן קיימות במערך הנתונים).
בנוסף, RANGE אינו תומך בעמודות תאריך.
אתגר
קלבאתגר הזה יש לנו נתונים על עיתונים שיוצרו. נרצה לדעת מהו מספר העיתונים הממוצע שהודפסו במהלך היומיים שלפני השורה הנוכחית ובמהלך היום שאחריה. כמו כן, נרצה לדעת מה ההפרש בין המספר המרבי למספר המזערי של העיתונים שהודפסו מהתאריך הנוכחי ובמהלך שלושת הימים שלפניו. קראו לעמודות האלה avg_newspapers ו-diff_newspapers, בהתאמה.
נסו בעצמכם
כל השיעורים ביחידה SQL למתקדמים
תרגלו בעצמכם: קומפיילר Python אונליין