دالة النافذة (SQL)

في لغة SQL ، تُعرف دالة النافذة أو الدالة التحليلية [ 1 ] بأنها دالة تستخدم قيمًا من صف واحد أو عدة صفوف لإرجاع قيمة لكل صف. (يختلف هذا عن دالة التجميع ، التي تُرجع قيمة واحدة لعدة صفوف). تحتوي دوال النافذة على عبارة OVER؛ أي دالة بدون عبارة OVER لا تُعد دالة نافذة، بل دالة تجميع أو دالة صف واحد (دالة عددية). [ 2 ]

مثال

كمثال على ذلك، إليك استعلام يستخدم دالة نافذة لمقارنة راتب كل موظف بمتوسط ​​رواتب قسمه (مثال من وثائق PostgreSQL ): [ 3 ]

SELECT depname , empno , salary , avg ( salary ) OVER ( PARTITION BY depname ) FROM empsalary ;

الناتج:

اسم القسم | رقم الموظف | الراتب | المتوسط ----------+-------+--------+---------------------- تطوير | 11 | 5200 | 5020.0000000000000000 تطوير | 7 | 4200 | 5020.0000000000000000 تطوير | 9 | 4500 | 5020.0000000000000000 تطوير | 8 | 6000 | 5020.0000000000000000 تطوير | 10 | 5200 | 5020.0000000000000000 الموظفون | 5 | 3500 | 3700.0000000000000000 الموظفون | 2 | 3900 | 3700.0000000000000000 المبيعات | 3 | 4800 | 4866.6666666666666667 المبيعات | 1 | 5000 | 4866.6666666666666667 المبيعات | 4 | 4800 | 4866.6666666666666667 (10 صفوف)

تُقسّم هذه PARTITION BYالعبارة الصفوف إلى أقسام، وتُطبّق الدالة على كل قسم على حدة. إذا PARTITION BYحُذفت العبارة (كما في حالة العبارة الفارغة )، فسيتم التعامل مع مجموعة النتائجOVER() بأكملها كقسم واحد. [ 4 ] في هذا الاستعلام، سيكون متوسط ​​الراتب المُبلغ عنه هو المتوسط ​​المحسوب على جميع الصفوف.

يتم تقييم دوال النافذة بعد التجميع (بعد GROUP BYجملة الشرط ودوال التجميع غير المتعلقة بالنافذة، على سبيل المثال). [ 1 ]

بناء الجملة

وفقًا لوثائق PostgreSQL، فإن دالة النافذة لها أحد الصيغ التالية: [ 4 ]

اسم_الدالة ([ تعبير [, تعبير ... ]]) فوق اسم_النافذة اسم_الدالة ([ تعبير [, تعبير ... ]]) فوق ( تعريف_النافذة ) اسم_الدالة ( * ) فوق اسم_النافذة اسم_الدالة ( * ) فوق ( تعريف_النافذة )

أين window_definitionتوجد الصيغة:

[ اسم_النافذة_الموجودة ] [ التقسيم حسب التعبير [, ... ] ] [ الترتيب حسب التعبير [ تصاعدي | تنازلي | باستخدام عامل التشغيل ] [ القيم الفارغة { الأول | الأخير } ] [, ... ] ] [ عبارة_الإطار ]

frame_clauseله بنية نحوية من إحدى الصيغ التالية:

{ النطاق | الصفوف | المجموعات } بداية الإطار [ استبعاد الإطار ] { النطاق | الصفوف | المجموعات } بين بداية الإطار ونهاية الإطار [ استبعاد الإطار ]

frame_startويمكن frame_endأن يكون UNBOUNDED PRECEDING، offset PRECEDING، CURRENT ROW، offset FOLLOWING، أو UNBOUNDED FOLLOWING. frame_exclusionيمكن أن يكون EXCLUDE CURRENT ROW، EXCLUDE GROUP، EXCLUDE TIES، أو EXCLUDE NO OTHERS.

expressionيشير إلى أي تعبير لا يحتوي على استدعاء لدالة نافذة.

الترميز:

  • تشير الأقواس المربعة [] إلى البنود الاختيارية.
  • تشير الأقواس المعقوفة {} إلى مجموعة من الخيارات المختلفة الممكنة، مع تحديد كل خيار بواسطة شريط عمودي |

مثال

تتيح دوال النافذة الوصول إلى البيانات في السجلات التي تسبق السجل الحالي وتليه مباشرةً. [ 5 ] [ 6 ] [ 7 ] [ 8 ] تُعرّف دالة النافذة إطارًا أو نافذة من الصفوف بطول مُحدد حول الصف الحالي، وتُجري عملية حسابية على مجموعة البيانات الموجودة في النافذة. [ 9 ] [ 10 ]

 الاسم | ------------ آرون | <-- السابق (غير محدود) أميليا| أندرو | جيمس| جيل| جوني | <-- الصف السابق الأول مايكل | <-- الصف الحالي نيك | <-- الصف الأول التالي أوفيليا| زاك | <-- متابعة (بدون حدود)

في الجدول أعلاه، يستخرج الاستعلام التالي لكل صف قيم نافذة تحتوي على صف سابق وصف لاحق:

حدد LAG ( name , 1 ) OVER ( ORDER BY name ) "prev" ، ثم name ، ثم LEAD ( name , 1 ) OVER ( ORDER BY name ) "next" من جدول people، ورتب النتائج حسب name.

تحتوي نتيجة الاستعلام على القيم التالية:

| السابق | الاسم | التالي | |----------|----------|----------| | (null)| آرون| أميليا| | آرون | أميليا | أندرو | | أميليا | أندرو | جيمس | | أندرو | جيمس | جيل | | جيمس | جيل | جوني | | جيل | جوني | مايكل | | جوني | مايكل | نيك | | مايكل | نيك | أوفيليا | | نيك | أوفيليا | زاك | | أوفيليا| زاك| (لا يوجد)|

تاريخ

تم دمج وظائف النوافذ في معيار SQL:2003 وتم توسيع وظائفها في المواصفات اللاحقة. [ 11 ]

تمت إضافة دعم لتطبيقات قواعد البيانات المحددة على النحو التالي:

انظر أيضاً

مراجع

  1. 1 2 "مفاهيم الدوال التحليلية في لغة SQL القياسية | BigQuery" . Google Cloud . تم الاسترجاع في 23 مارس 2021 .
  2. "وظائف النافذة" . sqlite.org . تم الاطلاع عليه بتاريخ 23-03-2021 .
  3. "3.5. دوال النافذة" . وثائق PostgreSQL . 11-02-2021 . تم الاطلاع عليه بتاريخ 23-03-2021 .
  4. 1 2 "4.2. تعابير القيمة" . وثائق PostgreSQL . 11-02-2021 . تم الاطلاع عليه بتاريخ 23-03-2021 .
  5. ليس، فيكتور؛ كونديكانجانا، كان؛ كيمبر، ألفونس؛ نيومان، توماس (يونيو 2015). "المعالجة الفعالة لوظائف النافذة في استعلامات SQL التحليلية". وقائع مؤسسة VLDB . 8 (10): 1058-1069 . doi : 10.14778/2794367.2794375 . ISSN 2150-8097 . 
  6. كاو، يو؛ تشان، تشي-يونغ؛ لي، جي؛ تان، كيان-لي (يوليو 2012). "تحسين دوال النافذة التحليلية". وقائع مؤسسة VLDB . 5 (11): 1244-1255 . arXiv : 1208.0086 . doi : 10.14778 /2350229.2350243 . ISSN 2150-8097 . 
  7. "ربما أروع ميزة في لغة SQL: دوال النافذة" . جافا، SQL و jOOQ . 2013-11-03 . تم الاطلاع عليه بتاريخ 2017-09-26 .
  8. "وظائف النافذة في SQL - حديث بسيط" . حديث بسيط . 31-10-2013 . تم الاسترجاع في 26-09-2017 .
  9. "مقدمة عن وظائف نافذة SQL" . Apache Drill .
  10. "PostgreSQL: Documentation: Window Functions" . www.postgresql.org . تم الاطلاع عليه بتاريخ 2020-04-04 .
  11. "نظرة عامة على وظائف النافذة" . قاعدة معارف MariaDB . تم الاسترجاع في 23-03-2021 .
  12. "ميزات جديدة في الإصدار الثاني من أوراكل 8i (8.1.6)" . www.oracle.com . تاريخ الاطلاع: 23 يناير 2025 .
  13. "الوظائف التحليلية في أوراكل 8i" (ملف PDF) . www.stanford.edu . تاريخ الاطلاع: 23 يناير 2025 .
  14. "إصدار PostgreSQL 8.4" . www.postgresql.org . 24 يوليو 2014. تاريخ الاسترجاع: 10 مارس 2024 .
  15. "MySQL :: ما الجديد في MySQL 8.0؟ (متوفر بشكل عام)" . dev.mysql.com . تم الاطلاع عليه بتاريخ 21-11-2022 . 
  16. "MySQL :: دليل مرجعي لـ MySQL 8.0 :: 12.21.2 مفاهيم وبنية دوال النافذة" . dev.mysql.com .  
  17. "ملاحظات إصدار MariaDB 10.2.0" . mariadb.com . تم الاطلاع عليه بتاريخ 10 مارس 2024 .
  18. "إصدار SQLite 3.25.0 بتاريخ 15 سبتمبر 2018" . www.sqlite.org . تم الاطلاع عليه بتاريخ 5 فبراير 2025 .