السلام عليكم
ربما لم يتعامل الكثيرين منا بـ
analytical functions
التي قدمتها شركة اوراكل لأول مرة مع قاعدة البيانات 8.1.6
ولا يعلم عن الفوائد التي تقدمها.
تستخدم الـ اناليتيكل فانشكن كحل سهل للأستعلامات المعقدة
وتأخذ شكل يشبه التالي:
SELECT RANK() OVER(ORDER BY product)
هناك عدد من الوظائف التخليلية (اناليتكال فانكشن) وتصنف وفق عدد من التصنيفات
بشكل سريع سنقوم بعرض نوع منها وتبيان فائدتها هنا.
الكود التالي في غاية البساطة وهو أول ما نتعلمه في لغة الإستعلامات:
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM employees
وإذا أضفنا
rownum
لعرض عدد الأسطر المعادة لنا سنجد أن النتيجة ستظهر لنا بالأمر التالي:
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY , rownum FROM employees
وماذا لو أردنا ترتيب النتائج بحسب الراتب ؟؟؟ الأمر مازال سهلا أليس كذلك ؟؟؟
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, rownum from employees order by salary
ولكن لنتوقف لحظة هنا ... هناك مشكلة في البيانات المعروضة
لقد اختلف ترقيم الأسطر الذي قمنا بعرضه ، ولا يتم عرض رقم السطر بالشكل الصحيح باستخدام
rownum
لماذا ؟؟؟
السبب أن تعليمة الترتيب تنفذ بعد أن يقوم العمود
rownum
برد قيمة السطر
ما الحل ؟؟؟
سنستخدم
subquery
ثم نقوم بترتيب النتائج بعدها ويمكن ذلك بالتعليمة التالية:
select EMPLOYEE_ID, FIRST_NAME, SALARY, ROWNUM from (SELECT EMPLOYEE_ID, FIRST_NAME, SALARY from employees order by salary) /
إلى الآن الأمر ليس معقدا ولكنه بدأ بأن يصبح طويلا بعض الشيء
وقد يتطور الأمر من البساطة إلى التعقيد ويمكننا أن ندرك ذلك إذا طلبنا تصنيف البيانات السابقة إلى شرائح حسب الراتب اقصد
RANKING
لحل هذه المشكلة يمكننا استبدال التعليمة السابقة والتي وصلنا إليها، بتعليمة أخرى اسهل والتي تسهل علينا التنفيذ وتعطي اداء أفضل من حيث زمن التنفيذ:
select EMPLOYEE_ID, FIRST_NAME, SALARY, -- ROWNUM, ROW_NUMBER() OVER (ORDER BY SALARY) ---- from (SELECT EMPLOYEE_ID, FIRST_NAME, SALARY from employees order by salary --) /
لاحظوا اننا استغنينا عن تعليمة الاستعلام الفرعية، وحلت محلها التعليمة الجديدة، وحصلنا على نفس النتيجة.
والآن يمكننا بنفس الطريقة عرض البيانات حسب الراتب وترتيبها إلى شرائح باستخدام فانكشن أخر:
DENSE_RANK()
select EMPLOYEE_ID, FIRST_NAME, SALARY, -- ROWNUM, DENSE_RANK() OVER (ORDER BY SALARY) ---- from (SELECT EMPLOYEE_ID, FIRST_NAME, SALARY from employees order by salary --) /
ما رأيكم ؟؟؟
أليس تنفيذ تعليمات للوصول إلى نفس النتائج وبسرعة أكبر أفضل من إعادة الإختراع
ملاحظة:
الجدول المستخدم تابع للمستخدم
HR
أرجو من له اطلاع أن يتابع في هذا الموضوع المهم
والسلام