Oracle "विभाजन द्वारा" खोजशब्द


253

क्या कोई कृपया बता सकता है कि partition byकीवर्ड क्या करता है और कार्रवाई में इसका एक सरल उदाहरण देता है, साथ ही साथ इसका उपयोग क्यों करना चाहता है? मेरे पास किसी और द्वारा लिखित SQL क्वेरी है और मैं यह पता लगाने की कोशिश कर रहा हूं कि यह क्या करता है।

द्वारा विभाजन का एक उदाहरण:

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

मैंने जो उदाहरण ऑनलाइन देखे हैं, वे थोड़े बहुत गहरे हैं।


एक अन्य प्रासंगिक लिंक: postgresql.org/docs/9.1/static/tutorial-window.html
शशांक विवेक

जवाबों:


259

PARTITION BYखंड रिकॉर्ड में मौजूद "समूह" के लिए इस्तेमाल किया जाएगा की सीमा सेट OVERखंड।

आपके उदाहरण एसक्यूएल में, 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 लेख पढ़ें ।


6
LAST_VALUE - अंतिम वेतन लौटाता है, MAX उच्चतम वेतन देता है
Maciek Kreft

1
क्या आपका मतलब है "बिना उप चयन के, जो बहुत धीमा है"? मुझे लगता है कि मैं उलझन में हूँ अगर उप चयन धीमा है या तेजी से last overऔर min over। मुझे लगता है कि एक उप चयन धीमा होगा, लेकिन जवाब में अंग्रेजी व्याकरण यह सुझाव नहीं देता है।
जेसन

यह दृष्टिकोण पंक्तियों को संसाधित होने की संख्या को कम कर देता है, जिससे यह सबसिलेक्ट से अधिक कुशल हो जाता है। बहुत बड़े डेटा सेट में सबसे अधिक ध्यान देने योग्य।
गाइ

164

अवधारणा को स्वीकार किए गए उत्तर द्वारा बहुत अच्छी तरह से समझाया गया है, लेकिन मुझे लगता है कि जितना अधिक एक उदाहरण देखता है, उतना ही बेहतर होता है। यहां एक वृद्धिशील उदाहरण है:

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     | 
+--------------+---------------+----------+

आदि...


3
यदि मुझे प्रत्येक समूह के लिए एक परिणाम प्राप्त करना है .. तो मैं इसे कैसे प्राप्त करूंगा?
विभू-ए

क्या आप जानते हैं कि यदि कहीं भी इस्तेमाल किया जा सकता है तो क्या इसका इस्तेमाल किया जा सकता है?
केविन बर्टन

मेरा सुझाव है कि आप एसओ पर एक प्रश्न पूछें, विवरण दें और समझाएं कि आप क्या हासिल करना चाहते हैं
बेन्सन

@ Viuu-a: तो आप शायद एक साधारण ग्रुप BY का उपयोग करना चाहते हैं।
२००

इस उदाहरण से प्यार करें ... समझने में आसान
जॉनी वू

27

यह SQL एक्सटेंशन है जिसे एनालिटिक्स कहा जाता है। चुनिंदा स्टेटमेंट में "ओवर" ऑरेकल को बताता है कि फ़ंक्शन एक विश्लेषणात्मक फ़ंक्शन है, फ़ंक्शन द्वारा समूह नहीं। एनालिटिक्स का उपयोग करने का लाभ यह है कि आप रकम का चयन कर सकते हैं, गिना जा सकता है, और डेटा के माध्यम से उप चयन या बदतर, पीएल / एसक्यूएल के साथ डेटा के माध्यम से लूपिंग के बजाय केवल एक से अधिक गुजरता है।

यह पहली बार में भ्रामक लगता है लेकिन यह दूसरी प्रकृति होगी। कोई भी इसे बेहतर समझाता है तो टॉम कायटे। तो ऊपर की लिंक बढ़िया है।

बेशक, प्रलेखन पढ़ना एक जरूरी है।


9
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

यहाँ हम संबंधित विभाग के लिए गणना कर रहे हैं। जैसा कि विभाग 10 के लिए हमारे पास तालिका में 4 रिकॉर्ड हैं, इसी तरह के परिणाम 20 और 30 के लिए भी हैं।


12
इस सवाल का कोई स्पष्टीकरण नहीं है कि कैसे काम करता है। केवल उदाहरण आउटपुट अकेले प्रश्न का पूरी तरह से उत्तर नहीं देता है।
सिराज समसुद्दीन

2

ओवर पार्टीशन कीवर्ड ऐसा है मानो हम क्लाइंट_ड द्वारा डेटा को विभाजित कर रहे हैं, प्रत्येक क्लाइंट आईडी का एक उपसमूह बना रहे हैं

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 द्वारा किए गए ऑपरेशनों की संख्या को लौटा देगी


0

मुझे लगता है, यह उदाहरण एक छोटी सी बारीकियों पर सुझाव देता है कि विभाजन कैसे काम करता है और समूह कैसे काम करता है। मेरा उदाहरण ओरेकल 12 से है, अगर मेरा उदाहरण एक संकलन बग है।

मैंने कोशिश की :

SELECT t.data_key
,      SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_a_rows
,      SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_b_rows
,      SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_c_rows
,      COUNT (1) total_rows
from mytable t
group by t.data_key  ---- This does not compile as the compiler feels that t.state isn't in the group by and doesn't recognize the aggregation I'm looking for

हालांकि यह उम्मीद के मुताबिक काम करता है:

SELECT distinct t.data_key
,      SUM ( CASE when t.state = 'A' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_a_rows
,      SUM ( CASE when t.state = 'B' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_b_rows
,      SUM ( CASE when t.state = 'C' THEN 1 ELSE 0 END) 
OVER   (PARTITION BY t.data_key) count_c_rows
,      COUNT (1) total_rows
from mytable t;

बाहरी कुंजी "data_key" के आधार पर प्रत्येक राज्य में तत्वों की संख्या का उत्पादन। तो, अगर, data_key = 'APPLE' में राज्य 'A' के साथ 3 पंक्तियाँ, राज्य 'B' के साथ 2 पंक्तियाँ, राज्य 'C' के साथ एक पंक्ति, 'APPLE' के लिए संगत पंक्ति 'APPLE' होगी, 3, 2 , १, ६।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.