أوراكل "قسم" بكلمة رئيسية
-
05-09-2019 - |
سؤال
يمكن للشخص يرجى توضيح ما 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