هل يوجد فرق بين "الصف الحالي" و"0 سابق/تالي" في جملة النوافذ الخاصة بوظائف Oracle التحليلية؟

StackOverflow https://stackoverflow.com/questions/379643

  •  22-08-2019
  •  | 
  •  

سؤال

تسمح بعض وظائف Oracle التحليلية بـ بند النوافذ لتحديد مجموعة فرعية من القسم الحالي، باستخدام كلمات أساسية مثل "غير محدود سابق/تابع" أو "الصف الحالي" أو "value_expr سابق/تابع" حيث تكون value_expr إزاحة مادية أو منطقية من الصف أو القيمة الحالية (اعتمادًا على ما إذا كنت حددت ROW أو RANGE، على التوالي).

فيما يلي مثال باستخدام scott/tiger الذي يعرض الموظفين في القسم 30، وعدد الموظفين في القسم الذين تم تعيينهم قبلهم (بما في ذلك أنفسهم):

select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and current row) cnt_hired_before1,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and 0 preceding) cnt_hired_before2
  from emp
 where deptno = 30
 order by deptno, hiredate;

... هل يمكن لأي شخص تقديم مثال أو وثائق حيث يختلف "الصف الحالي" عن "0 سابق/تابع"؟يبدو لي وكأنه سكر نحوي ...

هل كانت مفيدة؟

المحلول

وولا يهم حقا الذي تستخدمه. وهما من الطرق المختلفة للتعبير عن النوافذ، ولكن سوف محسن أداء الاستعلام بنفس الطريقة. مصطلح "الصف الحالي" هو واحد التي هي مشتركة بين قواعد بيانات متعددة مع الدوال التحليلية، وليس فقط أوراكل. انها اكثر من الفرق الأسلوبية، وبنفس الطريقة أن بعض الناس يفضلون عدد (*) على عدد (1).

نصائح أخرى

تقول وثائق Oracle التي يجب أن أسلمها (Oracle 9.2):

إذا قمت بتحديد النطاق:

  • value_expr عبارة عن إزاحة منطقية.يجب أن يكون ثابتًا أو تعبيرًا يقييم قيمة رقمية إيجابية أو فاصل حرفي.

هذا يعني أنك لا يجب أن تستخدم 0 حقًا لأنها ليست قيمة رقمية موجبة.ولكن من الواضح أنه من الممكن استخدام 0 السابق/التالي لأنك كذلك.

ومن كل شيء عن ما تحاول تحقيقه. قد تحتاج إلى استخدام تتراوح ما بين / الخلافات بين استخدامه للعثور على LAST_VALUE ضمن الأشياء أو مقارنة مجموعة فرعية ضمن مجموعة فرعية. ولكن بالتأكيد لا تحتاج للمثال الذي قدمته.

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top