এসকিউএল সার্ভার: পার্টির বাই এবং গ্রুপের মধ্যে পার্থক্য


365

আমি GROUP BYবছরের পর বছর ধরে সমস্ত ধরণের সামগ্রিক প্রশ্নের জন্য ব্যবহার করে আসছি । সাম্প্রতিককালে, আমি কিছু কোড বিপরীত-ইঞ্জিনিয়ারিং করেছি যা PARTITION BYসমষ্টি সম্পাদন করতে ব্যবহার করে। আমি যে ডকুমেন্টেশনগুলি সন্ধান করতে পারি তার মধ্যে পড়ে PARTITION BY, এটি অনেকটা মনে হয় GROUP BY, সম্ভবত কিছুটা অতিরিক্ত কার্যকারিতা যুক্ত করা হলে? এগুলি কি একই সাধারণ কার্যকারিতার দুটি সংস্করণ, বা এগুলি সম্পূর্ণ আলাদা কিছু?

উত্তর:


440

এগুলি বিভিন্ন জায়গায় ব্যবহৃত হচ্ছে। group byপুরো ক্যোয়ারীটি পরিবর্তন করে, যেমন:

select customerId, count(*) as orderCount
from Orders
group by customerId

তবে partition byকেবল একটি উইন্ডো ফাংশনে কাজ করে , যেমন row_number:

select row_number() over (partition by customerId order by orderId)
    as OrderNumberForThisCustomer
from Orders

একটি group byসারিবদ্ধভাবে ফিরে আসা সারির সংখ্যা হ্রাস করে এবং প্রতিটি সারির জন্য গড় বা योगের গণনা করে হ্রাস করে। partition byফিরে আসা সারিগুলির সংখ্যাকে প্রভাবিত করে না, তবে এটি উইন্ডো ফাংশনের ফলাফল গণনা করে কীভাবে পরিবর্তন করে।


23
সুন্দর উত্তর, আপনি দয়া করে তাদের প্রত্যেকের জন্য ফিরে প্রাপ্ত ফলাফলের নমুনা লিখবেন?
আশকান মোবায়েেন খেয়াবাণী

2
@ আশকানমোবায়েেনখিয়াবানি আপনি উত্তরওয়াইন্ডের বিরুদ্ধে উভয় প্রশ্ন চালাতে পারেন, যা আপনার এসকিএল সার্ভার সংস্করণের উপর নির্ভর করে ডিফল্টরূপে ইনস্টল করা বা নাও হতে পারে। যদি না হয় তবে এটি ডাউনলোডের পৃষ্ঠায় অনুসন্ধান করতে পারেন।
ফেচেজ লা ভ্যাচে

15
@ আশকান মোবায়েেনখিয়াবানি অরুণপ্রসন্তের নীচের উত্তরটি ফলাফলগুলি দেখায় যা ফলাফলগুলি আরও বেশি শিখতে ও উত্তরওয়াইন্ড শেখার সময়কে রক্ষা করার বিরোধিতা হিসাবে আপনার সময়কে বাঁচাতে পারে
প্রেক্সাইটেলস

1
উইন্ডোজ ফাংশনগুলিতে আরও (এসকিউএল এ): blog.jooq.org/2013/11/03/…
ডাটপস

itcodehub.blogspot.com/2019/03/… - এসকিউএল দ্বারা বিভাজন এবং বিভাগের মধ্যে পার্থক্য সম্পর্কে আরও তথ্য এবং উদাহরণ
xproph 30'19

252

আমরা একটি সহজ উদাহরণ নিতে পারেন।

TableAনিম্নলিখিত মানগুলির সাথে নামযুক্ত একটি সারণী বিবেচনা করুন :

id  firstname                   lastname                    Mark
-------------------------------------------------------------------
1   arun                        prasanth                    40
2   ann                         antony                      45
3   sruthy                      abc                         41
6   new                         abc                         47
1   arun                        prasanth                    45
1   arun                        prasanth                    49
2   ann                         antony                      49

GROUP BY

একাধিক রেকর্ড জুড়ে ডেটা সংগ্রহ করতে এবং ফলাফলকে এক বা একাধিক কলাম দ্বারা গোষ্ঠীভুক্ত করতে এসকিউএল গ্রুপ বাই ক্লজটি একটি নির্বাচনী বিবৃতিতে ব্যবহার করা যেতে পারে।

আরও সাধারণ কথায় GROUP BY স্টেটমেন্টটি এক বা একাধিক কলাম দ্বারা ফলাফল-সেটকে গোষ্ঠী করতে সমষ্টিগত ফাংশনগুলির সাথে একত্রে ব্যবহৃত হয়।

বাক্য গঠন:

SELECT expression1, expression2, ... expression_n, 
       aggregate_function (aggregate_expression)
FROM tables
WHERE conditions
GROUP BY expression1, expression2, ... expression_n;

আমরা GROUP BYআমাদের টেবিলে আবেদন করতে পারি :

select SUM(Mark)marksum,firstname from TableA
group by id,firstName

ফলাফল:

marksum  firstname
----------------
94      ann                      
134     arun                     
47      new                      
41      sruthy   

আমাদের আসল টেবিলটিতে আমাদের কাছে 7 টি সারি রয়েছে এবং যখন আমরা প্রয়োগ করি তখন GROUP BY idসার্ভারের উপর ভিত্তি করে ফলাফলগুলি গ্রুপ করে id:

সহজ কথায়:

এখানে GROUP BYসাধারণত Sum()প্রতিটি সারির জন্য ঘূর্ণায়মান এবং গণনা করে ফিরে আসা সারির সংখ্যা হ্রাস করে ।

PARTITION BY

বাই পার্টিশন যাওয়ার আগে আসুন আমরা এই OVERধারাটি দেখি :

এমএসডিএন সংজ্ঞা অনুসারে:

ওভার ক্লজটি একটি ক্যোরি রেজাল্ট সেটের মধ্যে উইন্ডো বা ব্যবহারকারী-সারি সারিগুলির সেটকে সংজ্ঞায়িত করে। একটি উইন্ডো ফাংশন তারপরে উইন্ডোতে প্রতিটি সারির জন্য একটি মান গণনা করে। চলমান গড়, ক্রমসংগ্রহ সমষ্টি, মোট চলমান, বা গোষ্ঠী ফলাফলের উপরে শীর্ষ এন এর মতো সামগ্রিক মানগুলি গণনা করতে আপনি ফাংশনগুলির সাথে ওভার ক্লজটি ব্যবহার করতে পারেন।

পক্ষ দ্বারা পার্টিশন ফিরে আসা সারিগুলির সংখ্যা হ্রাস করবে না।

আমরা আমাদের উদাহরণ সারণিতে অংশটি প্রয়োগ করতে পারি:

SELECT SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname FROM TableA

ফলাফল:

marksum firstname 
-------------------
134     arun                     
134     arun                     
134     arun                     
94      ann                      
94      ann                      
41      sruthy                   
47      new  

ফলাফলগুলি দেখুন - এটি সারিগুলিকে ভাগ করবে এবং সমস্ত সারি GROUP BY এর বিপরীতে ফিরিয়ে দেবে


3
partition by সারিগুলির সংখ্যাকে প্রভাবিত করতে পারে, এটি কেবল সারিগুলির সংখ্যা হ্রাস করবে না ।
জন

1
কি পার্থক্য হবে যদি আমি পরিবর্তন ছিল SELECTমধ্যে SELECT DISTINCTদ্বিতীয় ক্যোয়ারী কিভাবে? এটি কি GROUP BYক্যোয়ারির মতো একই ডেটা-সেটটি ফেরত দেবে না ? একটি বা অন্যটি বেছে নেওয়ার কারণগুলি কী কী?
এরিক 3 ই

3
@ Erick3E দয়া করে এই প্রশ্নে একটি চেহারা আছে stackoverflow.com/questions/20375074/...
Arunprasanth কেভি

আমি এই উত্তরটি আরও ভাল পছন্দ করি কারণ এটি দেখায় যে পার্টিশনে কীভাবে সর্বনিম্ন / সর্বোচ্চ / যোগফলগুলি কাজ করে। Row_Number () উদাহরণটি এটিকে পরিষ্কার করে না। সাধারণত আমি গ্রুপের মাধ্যমে একটি সামগ্রিক ফাংশন ব্যবহার করি তবে কেবল লক্ষ্য করেছি যে পার্টিশন-ওভারের একই পদ্ধতি রয়েছে এবং ওপিও একই জিনিসটি নিয়ে অবাক হয়েছিল - যা আমাকে এখানে নিয়ে যায়। ধন্যবাদ!
রিপভ্লান

53

partition byআসলে ডেটা রোল আপ না। এটি আপনাকে প্রতি গ্রুপ ভিত্তিতে কিছু রিসেট করার অনুমতি দেয়। উদাহরণস্বরূপ, আপনি গ্রুপিংয়ের ক্ষেত্রে বিভাজন করে এবং rownum()সেই গোষ্ঠীর মধ্যে সারিগুলি ব্যবহার করে একটি দলের মধ্যে একটি সাধারণ কলাম পেতে পারেন । এটি আপনাকে এমন কিছু দেয় যা একটি পরিচয় কলামের মতো কিছুটা আচরণ করে যা প্রতিটি গোষ্ঠীর শুরুতে পুনরায় সেট করে।


43

পার্টিশন দ্বারা পার্টিশন ফলাফলকে বিভাগে বিভক্ত করে। উইন্ডো ফাংশন প্রতিটি পার্টিশনে আলাদাভাবে প্রয়োগ করা হয় এবং প্রতিটি পার্টিশনের জন্য গণনা পুনরায় আরম্ভ হয়।

এই লিঙ্কে পাওয়া গেছে: ওভার ক্লজ


36

এটি ঘূর্ণায়মান ছাড়াই রোলড আপ ডেটা সরবরাহ করে

যেমন ধরুন আমি বিক্রয় অঞ্চলের আপেক্ষিক অবস্থানটি ফিরিয়ে দিতে চাই

বাই পার্টিশন ব্যবহার করে, আমি একটি নির্দিষ্ট অঞ্চলের বিক্রয়ের পরিমাণ এবং একই সারিতে সমস্ত বিক্রয় অঞ্চল জুড়ে MAX পরিমাণ ফেরত দিতে পারি ।

এর অর্থ এই নয় যে আপনার কাছে পুনরাবৃত্তি করা তথ্য থাকবে, তবে এটি শেষ উপভোক্তার সাথে মানিয়ে নিতে পারে যে ডেটা একত্রিত করা হয়েছে তবে কোনও ডেটা হারিয়ে যায়নি - গ্রুপের ক্ষেত্রে যেমন হবে।


3
সবচেয়ে ভাল, সহজ উত্তর।
tmthyjames

27

PARTITION BYবিশ্লেষণাত্মক, যদিও GROUP BYসামগ্রিক। ব্যবহার করার জন্য PARTITION BY, আপনাকে এটি একটি ওভার ক্লজ সহ ধারণ করতে হবে ।


1
PARTITION BY is analyticএই সাধারণ বিবৃতিটি আমার পক্ষে অনেকটাই সাফ করেছে। +1 টি।

এটি আসলে সবচেয়ে সহজ এবং সর্বোত্তম উত্তর।
jdmneon

22

আমার বোঝার হিসাবে পার্টিশন বাই প্রায় গ্রুপ গ্রুপ অনুসারে সমান, তবে নিম্নলিখিত পার্থক্য সহ:

সেই গোষ্ঠীটি প্রকৃতপক্ষে গোষ্ঠী অনুসারে ফলাফল নির্ধারণ করে একটি দলকে এক সারিতে ফিরিয়ে দেয়, যার ফলে ফলাফল হয় এসকিউএল সার্ভারের কেবলমাত্র বিভাগের বিভাজন অনুসারে গ্রুপের অংশীদারী নির্বাচনী কার্যগুলি বা কলামগুলিতে কেবল এস ইলেক্ট সার্ভারে ফলাফল দেয় (সেক্ষেত্রে এসকিউএল সার্ভার গ্যারান্টি দিতে পারে যে অনন্য আছে প্রতিটি দলের জন্য ফলাফল)।

উদাহরণস্বরূপ মাইএসকিউএল বিবেচনা করুন যা দলে অনুসারে গ্রুপে সংজ্ঞায়িত নয় এমন সেলেক্ট তালিকার কলামগুলিতে থাকতে দেয়, সেক্ষেত্রে একক সারি এখনও প্রতি গ্রুপে প্রত্যাবর্তিত হচ্ছে, তবে কলামটির অনন্য ফলাফল না থাকলে কোনও গ্যারান্টি নেই আউটপুট কি হবে!

পার্টিশন বাই দ্বারা, যদিও ফাংশনের ফলাফলগুলি গ্রুপ বাই সহ সামগ্রিক ফাংশনের ফলাফলের সমান, তবুও আপনি সাধারণ ফলাফলের সেটটি পেয়ে যাচ্ছেন যার অর্থ একটি অন্তর্নিহিত সারিতে এক সারি পাচ্ছে, এবং প্রতি সারি নয় গোষ্ঠী, এবং এর কারণে একটিতে কলাম থাকতে পারে যা SELECT তালিকায় গ্রুপ অনুসারে অনন্য নয়।

সুতরাং সংক্ষিপ্তসার হিসাবে, গ্রুপ প্রতি এক সারির আউটপুট প্রয়োজন যখন গ্রুপ বাই সেরা হবে, এবং পার্টিশন বাই সবচেয়ে ভাল হবে যখন যখন সমস্ত সারি প্রয়োজন হয় তবে তারা গ্রুপের ভিত্তিতে সামগ্রিক ফাংশন চায়।

অবশ্যই পারফরম্যান্স সংক্রান্ত সমস্যাও থাকতে পারে, দেখুন http://social.msdn.mic Microsoft.com/ Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba


2

আপনি যখন ব্যবহার GROUP BY , ফলস্বরূপ সারিগুলি সাধারণত আগত সারিগুলি কম হবে।

তবে, আপনি যখন ব্যবহার করবেন PARTITION BY, ফলস্বরূপ সারি গণনাটি আগত হিসাবে সমান হওয়া উচিত।


0

মনে করুন আমাদের 14 টি রেকর্ড রয়েছে name টেবিলে কলামের

ভিতরে group by

select name,count(*) as totalcount from person where name='Please fill out' group BY name;

এটি একক সারিতে অর্থাত্ 14 প্রদান করবে

কিন্তু partition by

select row_number() over (partition by name) as total from person where name = 'Please fill out';

এটি গণনা বৃদ্ধি 14 সারি হবে


0

ছোট পর্যবেক্ষণ। অটোমেশন প্রক্রিয়াটি 'পার্টিশন বাই' ব্যবহার করে গতিশীলভাবে এসকিউএল উত্পন্ন করতে 'গ্রুপ বাই' এর সাথে প্রয়োগ করা অনেক সহজ। 'গ্রুপ বাই' এর ক্ষেত্রে, আমাদের অবশ্যই 'নির্বাচন করুন' কলামের বিষয়বস্তুর যত্ন নিতে হবে।

আমার ইংরেজীর জন্য দুঃখিত.


0

এটিতে সত্যই আলাদা ব্যবহারের পরিস্থিতি রয়েছে। আপনি যখন গ্রুপ ব্যবহার করেন আপনি কলামগুলির অনুরূপ কিছু রেকর্ড একত্রী করেন এবং ফলাফল সেটটির সমষ্টি আপনার থাকে।

তবে আপনি যখন পার্টিশনটির মাধ্যমে পার্টিশনটি ব্যবহার করেন তখন আপনার ফলাফল সেটটি সমান হয় তবে উইন্ডো ফাংশনগুলির উপর আপনার কেবলমাত্র একটি সমষ্টি রয়েছে এবং আপনি রেকর্ডগুলি একীভূত করেন না, আপনার এখনও রেকর্ডের সমান গণনা থাকবে।

পার্থক্যটি ব্যাখ্যা করে একটি র‌্যালী সহায়ক নিবন্ধটি এখানে দেওয়া হয়েছে: http://alevryustemov.com/sql/sql-partition-by/


-1
-- BELOW IS A SAMPLE WHICH OUTLINES THE SIMPLE DIFFERENCES
-- READ IT AND THEN EXECUTE IT
-- THERE ARE THREE ROWS OF EACH COLOR INSERTED INTO THE TABLE
-- CREATE A database called testDB


-- use testDB
USE [TestDB]
GO


-- create Paints table
CREATE TABLE [dbo].[Paints](
    [Color] [varchar](50) NULL,
    [glossLevel] [varchar](50) NULL
) ON [PRIMARY]

GO


-- Populate Table
insert into paints (color, glossLevel)
select 'red', 'eggshell'
union
select 'red', 'glossy'
union
select 'red', 'flat'
union
select 'blue', 'eggshell'
union
select 'blue', 'glossy'
union
select 'blue', 'flat'
union
select 'orange', 'glossy'
union
select 'orange', 'flat'
union
select 'orange', 'eggshell'
union
select 'green', 'eggshell'
union
select 'green', 'glossy'
union
select 'green', 'flat'
union
select 'black', 'eggshell'
union
select 'black', 'glossy'
union
select 'black', 'flat'
union
select 'purple', 'eggshell'
union
select 'purple', 'glossy'
union
select 'purple', 'flat'
union
select 'salmon', 'eggshell'
union
select 'salmon', 'glossy'
union
select 'salmon', 'flat'


/*   COMPARE 'GROUP BY' color to 'OVER (PARTITION BY Color)'  */

-- GROUP BY Color 
-- row quantity defined by group by
-- aggregate (count(*)) defined by group by
select count(*) from paints
group by color

-- OVER (PARTITION BY... Color 
-- row quantity defined by main query
-- aggregate defined by OVER-PARTITION BY
select color
, glossLevel
, count(*) OVER (Partition by color)
from paints

/* COMPARE 'GROUP BY' color, glossLevel to 'OVER (PARTITION BY Color, GlossLevel)'  */

-- GROUP BY Color, GlossLevel
-- row quantity defined by GROUP BY
-- aggregate (count(*)) defined by GROUP BY
select count(*) from paints
group by color, glossLevel



-- Partition by Color, GlossLevel
-- row quantity defined by main query
-- aggregate (count(*)) defined by OVER-PARTITION BY
select color
, glossLevel
, count(*) OVER (Partition by color, glossLevel)
from paints
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.