همهٔ توابع پنجرهای رایج SQL و بندهایی که آنها را کنترل میکنند، گروهبندیشده بر پایهٔ کار: رتبهبندی ردیفها، نگاه به ردیفهای همسایه، اجرای جمعهای تجمعی روی یک قاب، و برداشتن مقدار اول یا آخر. هر ردیف، تابع را با یک مثال یکخطی جفت میکند.
تابع پنجرهای نتیجه را روی ردیفهای مرتبط با ردیف فعلی محاسبه میکند، بدون آنکه آنها را مثل GROUP BY فشرده کند. هر تابع پنجرهای با بند OVER تمام میشود که پنجره را تعریف میکند: PARTITION BY ردیفها را گروهبندی میکند، ORDER BY آنها را مرتب میکند، و قاب اختیاری مجموعهٔ لغزنده را محدود میکند. بر OVER مسلط شوید؛ باقی فقط واژگان است.
جدول مرجع · 27 مورد
توابع پنجرهای SQLExplained
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)