الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

analytical function

مغلق
بدأه sam_t95 في 29 أكتوبر 2006 · 3 رد · 1,661 مشاهدة · في قسم لغة الاستفسارات SQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ربما لم يتعامل الكثيرين منا بـ

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

أرجو من له اطلاع أن يتابع في هذا الموضوع المهم

والسلام

تم تعديل هذه المشاركة بواسطة sam_t95 في 29 أكتوبر 2006 في 21:25

#2

و أخيراً : تمت إضافة مشاركة قيمة للمنتدى ... جزالك الله خيراً ....

سأكمل في نفس الموضوع و لكن في الأيام القادمة و السبب كثرة المشاغل ..

#3

تفائلوا بالخير تجدوه

#4

درس جميل ....

لكن سؤال ..؟؟

ما هو تصنيف البيانات إلى شرائح RANKING

SCJP 5.0

هذا الموضوع مغلق.

مواضيع مشابهة