ওরাকল "পার্টিশন বাই বাই" কীওয়ার্ড


253

কেউ দয়া করে partition byকীওয়ার্ডটি কী তা ব্যাখ্যা করতে পারে এবং কার্যত এর একটি সাধারণ উদাহরণ দিতে পারে, পাশাপাশি কেন কেউ এটি ব্যবহার করতে চান? আমার অন্য কারও দ্বারা লিখিত একটি এসকিউএল কোয়েরি রয়েছে এবং আমি এটি কী করে তা বের করার চেষ্টা করছি।

দ্বারা বিভাজনের উদাহরণ:

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পেতে ফাংশন, উদাহরণস্বরূপ, ডিপার্টমেন্টে সর্বনিম্ন এবং সর্বোচ্চ বেতন এবং তারপর ব্যবহার যে এই রেকর্ড বেতন বিরুদ্ধে হিসাব ছাড়া একটি উপ নির্বাচন করুন, যা অনেক দ্রুততর।

আরও তথ্যের জন্য লিঙ্কযুক্ত অ্যাসটম নিবন্ধটি পড়ুন ।


6
LAST_VALUE - শেষ বেতন ফেরত, ম্যাক্স সর্বোচ্চ বেতন ফেরত
ম্যাকিক ক্র্যাফট

1
আপনার অর্থ কি "সাব সিলেকশন ছাড়াই, যা অনেক ধীর"? আমি যদি সাব নির্বাচন ধীর অথবা দ্রুততর চেয়ে বিভ্রান্ত করছি অনুমান last overএবং min over। আমি একটি সাব নির্বাচন ধীর হতে হবে কল্পনা করব, কিন্তু উত্তরে ইংলিশ ব্যাকরণ যে প্রস্তাব দেয় না।
জেসন

এই পদ্ধতির ফলে সারিগুলি প্রক্রিয়াজাত হওয়ার সংখ্যা হ্রাস করে, এটি সাবটেলকের চেয়ে আরও দক্ষ করে তোলে। খুব বড় ডেটা সেটগুলিতে সর্বাধিক লক্ষণীয়।
গাই

164

গ্রহণযোগ্য উত্তর দ্বারা ধারণাটি খুব ভালভাবে ব্যাখ্যা করা হয়েছে, তবে আমি দেখতে পেয়েছি যে যত বেশি উদাহরণ দেখবে ততই ততই ডুবে যায় Here এখানে একটি বর্ধিত উদাহরণ রয়েছে:

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
আমি যদি প্রতিটি গ্রুপের জন্য একটি ফলাফল পেতে চাই .. আমি কীভাবে এটি পাব?
ভাইউ -a

আপনি কি জানেন যে কোনও বিভাগের মাধ্যমে ওভার পার্টিশন ব্যবহার করা যেতে পারে?
কেভিন বার্টন

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এসও-তে একটি প্রশ্ন জিজ্ঞাসা করুন, বিশদ দিন এবং আপনি কী অর্জন করতে চান তা ব্যাখ্যা করুন
আন্দ্রেজস

@ ভিউ-এ: তাহলে আপনি সম্ভবত একটি সাধারণ গ্রুপ ব্যবহার করতে চাইবেন।
জ্যাকথিপস্টার

এই উদাহরণটি ভালবাসুন ... বুঝতে সহজ
জনি উ

27

এটি বিশ্লেষণ নামে পরিচিত এসকিউএল এক্সটেনশন। নির্বাচিত বিবৃতিতে "ওভার" অরাকলকে বলে যে ফাংশন একটি বিশ্লেষণাত্মক ফাংশন, ফাংশন অনুসারে একটি গ্রুপ নয়। বিশ্লেষণগুলি ব্যবহার করার সুবিধা হ'ল আপনি উপ-নির্বাচন বা আরও খারাপ, পিএল / এসকিউএল সহ ডেটা লুপিংয়ের পরিবর্তে কেবলমাত্র এক পাস দিয়ে অঙ্কগুলি, গণনা এবং আরও অনেক কিছু সংগ্রহ করতে পারেন।

এটি প্রথমে বিভ্রান্তিকর দেখাচ্ছে তবে এটি দ্রুত দ্বিতীয় প্রকৃতি হবে। টম কিট এর পরে আর কেউ এর চেয়ে ভাল ব্যাখ্যা করে না। সুতরাং উপরের লিঙ্কটি দুর্দান্ত।

অবশ্যই ডকুমেন্টেশন পড়া জরুরি ।


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;

এই ক্যোয়ারী ক্লায়েন্ট_আইডি দ্বারা পরিচালিত ক্রিয়াকলাপগুলির সংখ্যা প্রদান করবে


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;

বাহ্যিক কী "ডেটা_কি" এর উপর ভিত্তি করে প্রতিটি রাজ্যে উপাদানের সংখ্যা তৈরি করা। সুতরাং, যদি, ডেটা_কি = 'অ্যাপল' এর সাথে 'এ' রাষ্ট্রের সাথে 3 সারি, 'বি' রাষ্ট্রের সাথে 2 সারি, রাজ্য 'সি' সহ একটি সারি থাকে, তবে 'অ্যাপল' এর জন্য সংশ্লিষ্ট সারিটি 'অ্যাপল', 3, 2 হবে , 1, 6।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.