كل دوال النوافذ الشائعة في 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)
متوسط عبر إطار من 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)