سؤال

يمكن للشخص يرجى توضيح ما partition by الكلمة الرئيسية هي وإعطاء مثال بسيط عليه في العمل، وكذلك لماذا يريد المرء استخدامه؟ لدي استعلام SQL كتبه شخص آخر وأحاول معرفة ما يفعله.

مثال على التقسيم عن طريق:

SELECT empno, deptno, COUNT(*) 
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp

يبدو أن الأمثلة التي رأيتها عبر الإنترنت بعمق بعض الشيء.

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

المحلول

ال PARTITION BY يضع جملة مجموعة من السجلات التي سيتم استخدامها لكل "مجموعة" داخل OVER بند.

في المثال الخاص بك SQL، DEPT_COUNT سيعود عدد الموظفين داخل تلك القسم مقابل كل سجل موظف. (يبدو الأمر كما لو كنت دي سمي emp جدول؛ ما زلت تعيد كل سجل في emp جدول.)

emp_no  dept_no  DEPT_COUNT
1       10       3
2       10       3
3       10       3 <- three because there are three "dept_no = 10" records
4       20       2
5       20       2 <- two because there are two "dept_no = 20" records

إذا كان هناك عمود آخر (على سبيل المثال، state) ثم يمكنك حساب عدد الأقسام في تلك الدولة.

يشبه الحصول على نتائج GROUP BY (SUM, AVG, ، إلخ.) دون إجمالي مجموعة النتائج (أي إزالة السجلات المطابقة).

إنه مفيد عند استخدام LAST OVER أو MIN OVER وظائف للحصول عليها، على سبيل المثال، أدنى راتب وأعلى الراتب في القسم ثم استخدام ذلك في حساب مقابل راتب هذه السجلات بدون حدد فرعي، وهو أسرع بكثير.

قراءة المرتبطة asktom المادة لمزيد من التفاصيل.

نصائح أخرى

يتم تفسير المفهوم بشكل جيد للغاية من الإجابة المقبولة، لكنني أجد أن المثال الأكثر تعايشا، كلما تغرقت أفضل ذلك. إليك مثال تدريجي:

1) يقول بوس "احصلني على عدد العناصر لدينا في المخزون المجمعة حسب العلامة التجارية"

قول انت: "لا مشكلة"

SELECT 
      BRAND
      ,COUNT(ITEM_ID) 
FROM 
      ITEMS
GROUP BY 
      BRAND;

نتيجة:

+--------------+---------------+
|  Brand       |   Count       | 
+--------------+---------------+
| H&M          |     50        |
+--------------+---------------+
| Hugo Boss    |     100       |
+--------------+---------------+
| No brand     |     22        |
+--------------+---------------+

2) مدرب يقول "احصلني الآن على قائمة بجميع العناصر، مع علامتها التجارية وعدد العناصر التي تتمتع بها العلامة التجارية المعنية"

قد تحاول:

 SELECT 
      ITEM_NR
      ,BRAND
      ,COUNT(ITEM_ID) 
 FROM 
      ITEMS
 GROUP BY 
      BRAND;

لكن تحصل على:

ORA-00979: not a GROUP BY expression 

هذا هو المكان OVER (PARTITION BY BRAND) ادخل:

 SELECT 
      ITEM_NR
      ,BRAND
      ,COUNT(ITEM_ID) OVER (PARTITION BY BRAND) 
 FROM 
      ITEMS;

ما يعني:

  • COUNT(ITEM_ID) - احصل على عدد العناصر
  • OVER - فوق مجموعة الصفوف
  • (PARTITION BY BRAND) - هذا له نفس العلامة التجارية

والنتيجة هي:

+--------------+---------------+----------+
|  Items       |  Brand        | Count()  |
+--------------+---------------+----------+
|  Item 1      |  Hugo Boss    |   100    | 
+--------------+---------------+----------+
|  Item 2      |  Hugo Boss    |   100    | 
+--------------+---------------+----------+
|  Item 3      |  No brand     |   22     | 
+--------------+---------------+----------+
|  Item 4      |  No brand     |   22     | 
+--------------+---------------+----------+
|  Item 5      |  H&M          |   50     | 
+--------------+---------------+----------+

إلخ...

إنه ملحق SQL يسمى التحليلات. يخبر "Over" في عبارة Select Oracle أن الوظيفة هي وظيفة تحليلية، وليس مجموعة حسب الوظيفة. ميزة استخدام التحليلات هي أنه يمكنك جمع المبالغ والتحسب، وأكثر من ذلك بكثير مع مرور واحد فقط من خلال البيانات بدلا من الحلقات من خلال البيانات مع الاختيار الفرعية أو أسوأ، PL / SQL.

تبدو مربكة في البداية ولكن هذه ستكون ذات طبيعة ثانية بسرعة. لا أحد يفسر أنه أفضل ثم توم كيت. لذلك الرابط أعلاه رائع.

بالطبع، قراءة توثيق انها ضرورة.

EMPNO     DEPTNO DEPT_COUNT

 7839         10          4
 5555         10          4
 7934         10          4
 7782         10          4 --- 4 records in table for dept 10
 7902         20          4
 7566         20          4
 7876         20          4
 7369         20          4 --- 4 records in table for dept 20
 7900         30          6
 7844         30          6
 7654         30          6
 7521         30          6
 7499         30          6
 7698         30          6 --- 6 records in table for dept 30

هنا نحسب من أجل deptno المعنية. بالنسبة إلى Deptno 10 لدينا 4 سجلات في الجدول EMP نتائج مماثلة ل Deptno 20 و 30 أيضا.

الكلمة الأساسية للقسمة كما لو كنا نقسم البيانات حسب إنشاء عميل_ID مجموعة فرعية من كل معرف عميل

select client_id, operation_date,
       row_number() count(*) over (partition by client_id order by client_id ) as operationctrbyclient
from client_operations e
order by e.client_id;

سيعود هذا الاستعلام عدد العمليات التي يقوم بها العميل_ID

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top