GROUP BY এবং DISTINCT এর মধ্যে কি কোনও পার্থক্য রয়েছে?


310

আমি অন্য দিন এসকিউএল সম্পর্কে সাধারণ কিছু শিখেছি:

SELECT c FROM myTbl GROUP BY C

একই ফলাফল রয়েছে:

SELECT DISTINCT C FROM myTbl

আমি কৌতূহল বোধ করি, এসকিউএল ইঞ্জিন কমান্ডটি প্রক্রিয়াকরণের পদ্ধতিতে কি আলাদা কিছু আছে, বা তারা সত্যই একই জিনিস?

আমি ব্যক্তিগতভাবে পৃথক বাক্য গঠনটি পছন্দ করি তবে আমি নিশ্চিত যে এটি অন্য কোনও কিছুর চেয়ে অভ্যাসের চেয়ে বেশি।

সম্পাদনা: এটি সমষ্টি সম্পর্কে কোনও প্রশ্ন নয়। GROUP BYসামগ্রিক ফাংশন সহ ব্যবহার বোঝা যায়।


11
এটি সমষ্টি সম্পর্কে কোনও প্রশ্ন নয়, কোনও সমষ্টিগত কার্য উপস্থিত না থাকাকালীন এটি আলাদা আলাদা হিসাবে কাজ করে এমন একটি গ্রুপ
ব্রেটস্কি

2
আপনিও করতে পারেন এবং SELECT c FROM myTbl UNION SELECT c FROM myTblএকই ফলাফল পেতে পারেন ... তবে নির্বাচনগুলি যখন নির্বাচন এত সহজ হয় তখন কেন বিষয়গুলিকে জটিল করুন।
জারলহ

এর 'লজিকাল অর্ডার অফ এক্সিকিউশন' GROUP BY'সেলেক্ট' এর চেয়ে অনেক আগে এবং DISTINCTনির্বাচন অনুসরণ করে।
ব্যবহৃত_বাই_আলডিয়ার

একটি খুব সামান্য পার্থক্য যা আমি উল্লেখ করি নাই তা হ'ল DISTINCTক্ষেত্রটি নির্বাচনের ক্ষেত্রে ফলাফল - অর্থাত্ ফলাফলটি ফলাফলটিতে মানটি উপস্থিত হবে। GROUP BYক্ষেত্রটি নির্বাচন না করে কার্যকরভাবে ডুপ্লিকেটগুলি সরিয়ে ফেলতে পারে। এটি বেশিরভাগ ক্ষেত্রেই কিছুটা অপ্রাসঙ্গিক, তবে অন্যের ক্ষেত্রে আপনি যা চান ঠিক তেমন হতে পারে। আপনি যদি GROUP BYস্থলে ব্যবহার করে শেষ DISTINCTকরেন তবে কোডে একটি ব্যাখ্যামূলক মন্তব্য সম্ভবত সতর্কিত।
রিনোগো

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

উত্তর:


245

আপনার প্রশ্নের সাথে মুশিজেনেসিসের প্রতিক্রিয়া কার্যত সঠিক হিসাবে বলা হয়েছে; এসকিউএল সার্ভারটি উপলব্ধি করতে যথেষ্ট স্মার্ট যে আপনি যদি "গ্রুপ বাই" ব্যবহার করছেন এবং কোনও সামগ্রিক ফাংশন ব্যবহার করছেন না, তবে আপনি আসলে যা বোঝায় তা হ'ল "আলাদা" - এবং সুতরাং এটি একটি কার্যকরকরণ পরিকল্পনা উত্পন্ন করে যেমন আপনি কেবল "পৃথক" ব্যবহার করতেন । "

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

একটি হাতুড়ি কখনও কখনও স্ক্রুতে গাড়ি চালানোর জন্য কাজ করতে পারে, তবে যদি আপনি কোনও স্ক্রু ড্রাইভার পেয়ে যান তবে কেন বিরক্ত করবেন?

(এই সাদৃশ্যটির উদ্দেশ্যে Hammer : Screwdriver :: GroupBy : Distinctএবং screw => get list of unique values in a table column)


আমি আপনার সাথে সম্পূর্ণ চুক্তিতে আছি স্কেলান। আমি যখন এই কার্যকারিতাটি পেলাম তখন আমি বেশ অবাক হয়েছিলাম। এটি আমি ব্যবহার করার পরিকল্পনা করছি এমন কিছু নয়, তবে আমি কাজ করছি এমন নতুন জায়গায় জিনিসগুলি একটিভাবে করা হয়েছে।
ব্রেটস্কি 21

কমপক্ষে ওরাকেল ১২-এ এমন কিছু ঘটনা দেখা যায় যেখানে DISTINCT, ইউনিয়ন কর্তৃক পৃথক মান পাওয়া যায় এবং গ্রুপ দ্বারা আলাদাভাবে কাজ করা হয়। আমার ঠিক আজ আগে একটি মামলা হয়েছিল যেখানে DISTINCT এবং ইউনিয়ন দ্বারা পৃথক পৃথকভাবে একটি ওরাকল ত্রুটির সৃষ্টি করে, তবে গ্রুপ দ্বারা কাজ করেছে; আমি একটি ভিউ থেকে কেবল 1 টি কলাম নির্বাচন করছিলাম এবং কোনও সমষ্টি ব্যবহার করছিলাম না; কেন এটি প্রয়োজন তা আমি এখনও বিস্মিত হয়েছি, তবে এটি কার্যকর করে যে কিছু কার্যকর হয়েছে তা নিশ্চিত করে। অন্যরা যেমন উল্লেখ করেছে, এটি আপনাকে কলামগুলি বাছাই না করে গ্রুপ করতে দেয়, যদিও এটি সংহতকরণ ছাড়া খুব কমই প্রয়োজন।
জিরোক

1
যখন এটি এসকিউএল আসে তখন আপনার সর্বদা স্ক্রু ড্রাইভার এবং হাতুড়ি উভয়ই উপলব্ধ। স্ক্রুতে গাড়ি চালানোর জন্য হাতুড়ি কেন ব্যবহার করবেন?
জারলহ

আপনার সাথে সাদৃশ্যটি পরিষ্কার করার জন্য - আপনার হাতুড়িটি কি == গোষ্ঠী দ্বারা এবং স্ক্রু ড্রাইভার == এক্ষেত্রে স্বতন্ত্র?
হোপকিং

বাহ, দশ বছরের এই প্রশ্নটির এখনও পা আছে! "স্বতন্ত্র" হ'ল স্ক্রু ড্রাইভার, যদি "অনন্য মূল্যগুলির তালিকা" থাকে স্ক্রু। সাদৃশ্যটি আরও পরিষ্কার করার জন্য উত্তরটি আপডেট করব।
স্কেলান

136

GROUP BYআপনি সমষ্টিগত ফাংশন, ব্যবহার করতে দেয় মত AVG, MAX, MIN, SUM, এবং COUNT। অন্যদিকে DISTINCTকেবল নকলগুলি সরান।

উদাহরণস্বরূপ, যদি আপনার কাছে ক্রয়ের রেকর্ডগুলি থাকে এবং আপনি প্রতিটি বিভাগ কতটা ব্যয় করেছেন তা জানতে চান, আপনি এরকম কিছু করতে পারেন:

SELECT department, SUM(amount) FROM purchases GROUP BY department

এটি আপনাকে বিভাগের জন্য এক সারি দেবে, বিভাগের নাম এবং বিভাগের amountসমস্ত সারিতে সমস্ত মানের সমষ্টি containing


2
আমি বুঝতে পারি গ্রুপের ব্যবহার, প্রশ্নটি এই ভিত্তিতে তৈরি করা হয় যে যখন কোনও সামগ্রিক কার্য উপস্থিত থাকে না তখন এটি একটি স্বতন্ত্র ডেটাসেট ফেরত দেয়।
ব্রেটস্কি 20

2
কারণ গ্রুপ আপ দ্বারা স্পষ্টভাবে আপনি যে কলামটির গোষ্ঠীভুক্ত করছেন কলামের মানগুলি সম্পর্কে একটি ডিস্টিন্ট করে (কাকোফোনের জন্য দুঃখিত)।
জো পাইনেদা 21

DISTINCTএকটি সামগ্রিক ফাংশন + ব্যবহার করা কি সম্ভব নয় ? select distinct department, SUM(amount) from ...
এটির

@ সাজাদ, আপনি এটি হ্যাঁ করতে পারেন, তবে আপনাকে এখনও গ্রুপের মাধ্যমে নিতে হবে, তাই ডিসাইস্ট্যান্ট আপনার পক্ষে কিছু করে না।
জিরোক

44

কোনও পার্থক্য নেই (এসকিউএল সার্ভারে, অন্তত)। উভয় প্রশ্নের একই কার্যকরকরণ পরিকল্পনা ব্যবহার করে।

http://sqlmag.com/database-performance-tuning/distinct-vs-group

হয়তো হয় , একটি পার্থক্য আছে জড়িত উপ-বিষয় দেওয়া হল:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

কোনও পার্থক্য নেই (ওরাকল স্টাইল):

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212


40

কেবলমাত্র সদৃশ অপসারণ কার্যকারিতা বিন্দু থেকে পার্থক্য কি

এছাড়াও যে অসদৃশ থেকে DISTINCT, GROUP BYডেটা সমষ্টি জন্য করতে পারবেন গ্রুপ প্রতি (অন্যান্য অনেক উত্তর উল্লেখ করা হয়েছে), আমার মতে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য যে দুটি অপারেশন দুটি খুব বিভিন্ন পদক্ষেপ এ "ঘটতে" হয় লজিক্যাল ক্রম অপারেশনগুলি যা একটি SELECTবিবৃতিতে কার্যকর করা হয়

এখানে সর্বাধিক গুরুত্বপূর্ণ অপারেশন রয়েছে:

  • FROM(সহ JOIN, APPLYইত্যাদি)
  • WHERE
  • GROUP BY (সদৃশ অপসারণ করতে পারেন)
  • মোট পরিমাণ
  • HAVING
  • উইন্ডো ফাংশন
  • SELECT
  • DISTINCT (সদৃশ অপসারণ করতে পারেন)
  • UNION, INTERSECT, EXCEPT (সদৃশ অপসারণ করতে পারেন)
  • ORDER BY
  • OFFSET
  • LIMIT

আপনি দেখতে পাচ্ছেন যে প্রতিটি অপারেশনের যৌক্তিক ক্রম এর সাথে কী করা যায় এবং পরবর্তী কাজগুলিকে কীভাবে প্রভাবিত করে তা প্রভাবিত করে। বিশেষত, GROUP BYঅপারেশন "SELECT প্রক্ষেপণ " এর আগে " অপারেশনটি ঘটে" এর অর্থ এই যে:

  1. এটি প্রক্ষেপণের উপর নির্ভর করে না (যা কোনও সুবিধা হতে পারে)
  2. এটি অভিক্ষেপ থেকে কোনও মান ব্যবহার করতে পারে না (যা কোনও অসুবিধা হতে পারে)

1. এটি অভিক্ষেপের উপর নির্ভর করে না

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

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating

সাকিলা ডাটাবেসের বিরুদ্ধে চালানো হলে , ফলন হয়:

rating   rn
-----------
G        1
NC-17    2
PG       3
PG-13    4
R        5

এটি DISTINCTসহজেই অর্জন করা যায়নি :

SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film

এই ক্যোয়ারীটি "ভুল" এবং এর থেকে কিছু পাওয়া যায়:

rating   rn
------------
G        1
G        2
G        3
...
G        178
NC-17    179
NC-17    180
...

এটি আমরা যা চেয়েছিলাম তা নয়। DISTINCTঅপারেশন "পরে ঘটবে" তাই আমরা আর সরাতে পারেন, অভিক্ষেপ DISTINCTরেটিং উইন্ডোতে ফাংশন ইতিমধ্যে হিসাব অভিক্ষিপ্ত করা হয়েছে কারণ। ব্যবহার করতে DISTINCT, আমাদের ক্যোয়ারির সেই অংশটি বাসাতে হবে:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
  SELECT DISTINCT rating FROM film
) f

পার্শ্ব-নোট: এই বিশেষ ক্ষেত্রে, আমরা ব্যবহার করতে পারেDENSE_RANK()

SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film

২. এটি অভিক্ষেপ থেকে কোনও মান ব্যবহার করতে পারে না

এসকিউএল এর অন্যতম অপূর্ণতা হ'ল মাঝে মাঝে এর ভার্বোসটি। আমরা এর আগে যা দেখেছি তার একই কারণে (যথা অপারেশনের লজিকাল অর্ডার), আমরা কোনও কিছু প্রজেক্টের মাধ্যমে "সহজেই" গ্রুপ করতে পারি না।

এটি অবৈধ এসকিউএল:

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name

এটি বৈধ (এক্সপ্রেশন পুনরাবৃত্তি)

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name

এটিও বৈধ, অভিব্যক্তিতে বাসা বেঁধে

SELECT name
FROM (
  SELECT first_name || ' ' || last_name AS name
  FROM customer
) c
GROUP BY name

আমি এই বিষয়ে আরও একটি ব্লগ পোস্টে গভীরতার সাথে লিখেছি


এই প্রশ্নে মৃত্যুদণ্ডের আদেশটি তত্ক্ষণাত আলোচনা করা হয়নি তা দেখে আমি সত্যই অবাক হয়েছি। আপনাকে ধন্যবাদ, খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে। আপনার পয়েন্ট ২- তে কিছু (এক?) ডিবি'র পুরো ক্যোয়ারীতে নির্বাচিত উপকরণ ব্যবহারের অনুমতি দেয় (আমি যেটাকে জানি তা তেরদাতা, তবে এটি ব্যতিক্রম)।
ব্যবহৃত_বাই_আলডিয়ার

@ ইউজড_বাই_আলডিয়ার: অবশ্যই, কিছু ডাটাবেস এটি করে। অনেকগুলি ডাটাবেস কেবলমাত্র সেই অংশে (যেমন নয় WHEREতবে সম্ভবত GROUP BY) সেইগুলি উপকরণগুলি ব্যবহারের অনুমতি দেয় । যাইহোক, আমি মনে করি এটি একটি খারাপ ধারণা এবং আমি প্রস্তাব করি যে বৈশিষ্ট্যটি বহনযোগ্যতা এবং রক্ষণাবেক্ষণের কারণে কখনও ব্যবহার করবেন না। "হঠাৎ করে" এটি আর কাজ করবে না, উদাহরণস্বরূপ যখন একটি সামগ্রিক ফাংশন বা উইন্ডো ফাংশনটি অ্যালিজ করে।
লুকাশ এডার

never using that feature for portability and maintenance reasons!! 100% সম্মত ... এবং আমি এখন আপনার ব্লগটিও খুব ভাল কাজ করে নিচ্ছি। চিয়ার্স।
ব্যবহৃত_বাই_আলডিয়ার

32

DISTINCTআপনি যদি কেবল নকলগুলি সরাতে চান তবে ব্যবহার করুন । ব্যবহার করুন GROUPY BYযদি আপনি সমষ্টিগত অপারেটার প্রয়োগ করতে চান ( MAX, SUM, GROUP_CONCAT, ..., অথবা একটি HAVINGদফা)।


19

আমি আশা করি তাদের কার্যকর করার ক্ষেত্রে সূক্ষ্ম পার্থক্যের সম্ভাবনা রয়েছে। আমি ওরাকল 10 জি-তে এই লাইনগুলিতে দুটি কার্যকরী সমতুল্য প্রশ্নের জন্য কার্যকর করার পরিকল্পনাগুলি পরীক্ষা করেছি:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

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

তবে আমি মনে করি যেহেতু অপারেশনের নামগুলি পৃথক, কার্যকরভাবে কিছু ভিন্ন কোডের পথ অনুসরণ করা হবে এবং এটি আরও উল্লেখযোগ্য পার্থক্যের সম্ভাবনাটি খুলবে।

আমি মনে করি আপনার এই উদ্দেশ্যে DISTINCT সিনট্যাক্স পছন্দ করা উচিত। এটি কেবল অভ্যাস নয়, এটি কোয়েরির উদ্দেশ্যটি আরও স্পষ্টভাবে নির্দেশ করে।


14

আপনার পোস্ট করা ক্যোয়ারির জন্য, তারা অভিন্ন। তবে অন্যান্য প্রশ্নের ক্ষেত্রে এটি সত্য নাও হতে পারে।

উদাহরণস্বরূপ, এটি এর মতো নয়:

SELECT C FROM myTbl GROUP BY C, D

14

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

স্বতন্ত্র সমস্ত সারি প্রদান করে তারপরে সেগুলিকে ডি-সদৃশ করে যখন গ্রুপ অনুসারে একের পর এক অ্যালগোরিদম দ্বারা পড়ার সাথে সাথে সারিগুলি ডি-ডুপ্লিকেট করে।

এর অর্থ তারা বিভিন্ন ফলাফল তৈরি করতে পারে!

উদাহরণস্বরূপ, নীচের কোডগুলি বিভিন্ন ফলাফল উত্পন্ন করে:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

যদি টেবিলের মধ্যে 10 টি নাম থাকে যেখানে 1 টির মধ্যে অন্যটির সদৃশ হয় তবে প্রথম ক্যোয়ারীতে 10 টি সারি ফেরত আসে যখন দ্বিতীয় ক্যোয়ারীতে 9 টি সারি আসে।

কারণটি আমি উপরে যা বলেছি তাই তারা অন্যরকম আচরণ করতে পারে!


11
কারণ আপনি যখন কেবলমাত্র গ্রুপিং করছেন Name দ্বিতীয় , মূলশব্দটি প্রথম ক্যোয়ারীর ধারাটিতে আপনার distinctকলাম Nameএবং আপনার ROW_NUMBER()কলাম উভয় ক্ষেত্রেই প্রযোজ্য select। আপনি যদি দ্বিতীয় কোয়েরিতে প্রথম কলামটিও গোষ্ঠীভূত করেন তবে অনুসন্ধানগুলি একই ফলাফলটি ফিরিয়ে আনত।

এটি order of executionএসকিউএল ধারাগুলির একটি ফলাফল যা (সাধারণ অর্থে) FROM and ON (joins) , WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT / OFFSET / TOP, যাতে দ্বিতীয় ক্যোয়ারী নাম দ্বারা একদল সংখ্যা কমে এবং পরে ROW_NUMBER () এক সারি ফলে প্রয়োগ করা হয় প্রতি অনন্য নাম। প্রথম ক্যোয়ারিতে row_number () প্রয়োগ করা হয় আলাদা আলাদাভাবে প্রয়োগ করার আগে, এবং row_number () ফাংশনের প্রকৃতির কারণে প্রতিটি সারিতে একটি স্বতন্ত্র পূর্ণসংখ্যা পাওয়া যায়, এইভাবে বারবার নামের মান থাকলেও প্রতিটি সারি ফিরে আসে।
ব্যবহৃত_বাই_আলডিয়ার

12

আপনি যদি একাধিক কলাম সহ DISTINCT ব্যবহার করেন তবে ফলাফল সেটটিকে গ্রুপ হিসাবে নেওয়া হবে না কারণ এটি গ্রুপের মাধ্যমে হবে এবং আপনি DISTINCT সহ সামগ্রিক ফাংশন ব্যবহার করতে পারবেন না।


11

তাদের আলাদা আলাদা শব্দার্থক শব্দ রয়েছে, এমনকি যদি তাদের আপনার নির্দিষ্ট ডেটাতে সমমানের ফলাফল হয়।


6

গ্রুপ বাই একটি খুব সুনির্দিষ্ট অর্থ যা DISTINCT ফাংশন থেকে স্বতন্ত্র (heh)।

GROUP BY দ্বারা নির্বাচিত এক্সপ্রেশন ব্যবহার করে ক্যোয়ারির ফলাফলগুলিকে গোষ্ঠীভূত করা হয়, সমষ্টিগত ফাংশনগুলি তখন প্রয়োগ করা যেতে পারে এবং এগুলি পুরো ফলাফলের পরিবর্তে প্রতিটি গ্রুপে কাজ করবে।

এখানে একটি উদাহরণ যা সাহায্য করতে পারে:

এমন দেখতে একটি টেবিল দেওয়া হয়েছে:

name
------
barry
dave
bill
dave
dave
barry
john

এই ক্যোয়ারী:

SELECT name, count(*) AS count FROM table GROUP BY name;

এভাবে আউটপুট উত্পাদন করবে:

name    count
-------------
barry   2
dave    3
bill    1
john    1

যা DISTINCT ব্যবহারের থেকে স্পষ্টতই আলাদা। আপনি যদি নিজের ফলাফলগুলি গোষ্ঠীভুক্ত করতে চান তবে গ্রুপটি ব্যবহার করুন, যদি আপনি কেবল একটি নির্দিষ্ট কলামের একটি অনন্য তালিকা চান তবে DISTINCT ব্যবহার করুন। এটি আপনার ডাটাবেসটিকে আপনার প্রয়োজনের জন্য ক্যোয়ারীটি অনুকূল করার সুযোগ দেবে।


6

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


5

আপনি যদি কোনও সমষ্টিগত ফাংশন ব্যতীত গ্রুপ ব্যবহার করে থাকেন তবে অভ্যন্তরীণভাবে এটি DISTINCT হিসাবে বিবেচিত হবে, সুতরাং এক্ষেত্রে GROUP BY এবং DISTINCT এর মধ্যে কোনও পার্থক্য নেই।

কিন্তু যখন আপনাকে DISTINCT শর্ত সরবরাহ করা হয় তখন আপনার অনন্য রেকর্ডগুলি সন্ধানের জন্য এটি ব্যবহার করা আরও ভাল কারণ গ্রুপ বাই গ্রুপের উদ্দেশ্য একত্রিত করা achieve


4

গোষ্ঠী দ্বারা সমষ্টিগত ক্রিয়াকলাপগুলিতে ব্যবহৃত হয় - যেমন আপনি যখন কলাম C দ্বারা বিছিন্ন বিএসের একটি গণনা পেতে চান

select C, count(B) from myTbl group by C

স্বতন্ত্র এটি যা শোনাচ্ছে - আপনি অনন্য সারি পান।

স্ক্যুয়াল সার্ভার 2005-এ, দেখে মনে হচ্ছে ক্যোরি অপ্টিমাইজারটি আমার যে সরল উদাহরণ দিয়েছিল তার মধ্যে পার্থক্যটি অপ্টিমাইজ করতে সক্ষম। ডুনো যদি আপনি সমস্ত পরিস্থিতিতে এটির উপর নির্ভর করতে পারেন তবে।


3

সেই বিশেষ ক্যোয়ারিতে কোনও পার্থক্য নেই। তবে অবশ্যই আপনি যদি কোনও সামগ্রিক কলাম যুক্ত করেন তবে আপনাকে গোষ্ঠীটি ব্যবহার করতে হবে।


3

তেরদাটা দৃষ্টিকোণে :

ফলাফল সেট দৃষ্টিকোণ থেকে, আপনি তেরদাটাতে DISTINCT বা GROUP BY ব্যবহার করেন তাতে কিছু আসে যায় না। উত্তর সেট একই হবে।

পারফরম্যান্সের দৃষ্টিকোণ থেকে, এটি এক নয়।

কর্মক্ষমতা কী প্রভাবিত করে তা বোঝার জন্য, DISTINCT বা GROUP BY এর মাধ্যমে একটি বিবৃতি কার্যকর করার সময় তেরদাটাতে কী ঘটেছিল তা আপনার জানতে হবে।

DISTINCT এর ক্ষেত্রে, কোনও পূর্বশক্তি না হয়েই সারিগুলি তত্ক্ষণাত পুনরায় বিতরণ করা হয়, যখন গ্রুপের ক্ষেত্রে, প্রথম ধাপে একটি পূর্বনির্ধারিত কাজ করা হয় এবং তারপরেই এএমপিগুলিতে অনন্য মূল্যবোধগুলি পুনরায় বিতরণ করা হয়।

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

সংক্ষেপে, তেরডাটাতে DISTINCT বনাম গ্রুপের অর্থ:

অনেকগুলি সদৃশ DISTINCT -> কোনও বা কয়েকটি নকলের জন্য - দ্বারা গ্রুপ করুন। সময়ে, DISTINCT ব্যবহার করার সময়, আপনি একটি এএমপিতে স্পুল স্পেসের বাইরে চলে যান। কারণটি হ'ল পুনরায় বিতরণ অবিলম্বে সংঘটিত হয় এবং স্কিউিংয়ের ফলে এএমপিগুলির স্থান খুব কম যায়।

যদি এটি ঘটে থাকে তবে আপনার সম্ভবত গ্রুপের সাথে আরও ভাল সম্ভাবনা রয়েছে কারণ ডুপ্লিকেটগুলি ইতিমধ্যে প্রথম ধাপে সরানো হয়েছে এবং এএমপিগুলিতে কম ডেটা সরিয়ে নেওয়া হয়েছে।


কী Teradata?
ব্রেটস্কি

টেরাদাতা হ'ল একটি রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেম (আরডিবিএমএস), বিভিন্ন ক্লায়েন্ট প্ল্যাটফর্ম থেকে বহু যুগ্ম ব্যবহারকারীকে সমর্থন করতে সক্ষম। টেরাদাতা এএনএসআই স্ট্যান্ডার্ডের সাথে সামঞ্জস্যপূর্ণ এবং সমান্তরাল আর্কিটেকচারে সম্পূর্ণরূপে নির্মিত।
রাম গদিয়ারাম

2

একটি 'এসকিউএল ভাষা' দৃষ্টিকোণ থেকে দুটি কনস্ট্রাক্ট সমান এবং আপনি যেটি চয়ন করেন সেগুলি আমাদের 'লাইফস্টাইল' পছন্দগুলির মধ্যে একটি। আমি মনে করি DISTINCT এর আরও সুস্পষ্ট হওয়ার পক্ষে একটি ভাল কেস রয়েছে (এবং সুতরাং যে ব্যক্তিটি আপনার কোড ইত্যাদির উত্তরাধিকারী হবে তার পক্ষে আরও বিবেচ্য) তবে এর অর্থ এই নয় যে গ্রুপ বাই কনস্ট্রাক্ট একটি অবৈধ পছন্দ।

আমি মনে করি এই 'গ্রুপ বাই গ্রাহকদের জন্য' ভুল জোর। লোকদের সচেতন হওয়া উচিত যে সেট ফাংশন (MAX, MIN, COUNT, ইত্যাদি) বাদ দেওয়া যেতে পারে যাতে কোডারের উদ্দেশ্য যখন হয় তখন তারা বুঝতে পারে।

আদর্শ অপ্টিমাইজার সমতুল্য এসকিউএল কনস্ট্রাক্টকে স্বীকৃতি দেবে এবং সেই অনুযায়ী আদর্শ পরিকল্পনাটি সর্বদা চয়ন করবে। আপনার পছন্দের সত্য জীবনের এসকিউএল ইঞ্জিনের জন্য, আপনাকে অবশ্যই পরীক্ষা করতে হবে :)

PS নোট করুন নির্বাচিত ধারাটিতে DISTINCT কীওয়ার্ডের অবস্থানটি বিভিন্ন ফলাফল যেমন বিপরীতে উপস্থাপন করতে পারে:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

আপনি কেবল এটি লক্ষ্য করছেন কারণ আপনি একটি একক কলাম নির্বাচন করছেন।

দুটি ক্ষেত্র নির্বাচন করার চেষ্টা করুন এবং দেখুন কী ঘটে।

গোষ্ঠী দ্বারা এই জাতীয়ভাবে ব্যবহার করা উদ্দেশ্য:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

যা প্রতিটি ব্যক্তির জন্য সমস্ত লেনদেনের যোগফল প্রদর্শন করবে।


এটি সমষ্টিগুলির প্রশ্ন নয়। আপনার উদাহরণে, সি, সি, ডি থেকে মাইটিবিএল গ্রুপ থেকে সিলেক্ট করুন; আসলে সিলেক্ট ডিসট্রিন্ট সি, ডি থেকে মাইটিবিএল হিসাবে সেট একই ডেটা ফেরত দেবে; এটি প্রশ্নের মৌলিক বিষয়গুলি
ব্রেটস্কি

1

আমি জানি এটি একটি পুরানো পোস্ট। তবে এমনটি ঘটে যে আমার কাছে এমন একটি কোয়েরি ছিল যা কেবলমাত্র টোডে এবং ওরাকল রিপোর্টে সমস্ত কিছুর সূক্ষ্মভাবে কাজ করেছিল রিপোর্টটিতে স্বতন্ত্র মানগুলি ফিরিয়ে দেওয়ার জন্য গোষ্ঠীটি ব্যবহার করেছিল, আমি একটি ভাল প্রতিক্রিয়া সময় বলতে চাইছি। যখন আমরা ওরাকল 9 আই থেকে 11 জি তে স্থানান্তরিত হয়েছি টোডের প্রতিক্রিয়া সময়টি দুর্দান্ত ছিল তবে পুনরায় পোস্টে এটি পূর্ববর্তী সংস্করণটি ব্যবহার করার সময় প্রায় 5 মিনিট সময় নেয় রিপোর্টটি শেষ করতে প্রায় 35 মিনিট সময় নেয়।

সমাধানটি ছিল গ্রুপটি পরিবর্তন করে DISTINCT ব্যবহার করা এবং এখন রিপোর্টটি প্রায় 30 সেকেন্ডে চলে।

আমি আশা করি একই পরিস্থিতিতে কারও পক্ষে এটি কার্যকর for


1

ব্যবহারের ক্ষেত্রে, GROUP BY আপনার ব্যবহৃত গণনা করতে চান সেই সারিগুলি গোষ্ঠীকরণের জন্য ব্যবহৃত হয়। DISTINCT কোনও গণনা করবে না। এটি কোনও সদৃশ সারি প্রদর্শন করবে না।

আমি সদৃশ না করে ডেটা উপস্থাপন করতে চাইলে আমি সর্বদা DISTINCT ব্যবহার করি।

আমি যদি আমের মোট পরিমাণ যোগ করে দেওয়ার মতো হিসাব করতে চাই তবে আমি গ্রুপ বাই ব্যবহার করব


0

আমি যেভাবে সর্বদা এটি বুঝতে পেরেছি তা হল যে স্বতন্ত্র ব্যবহার করা আপনি তাদের নির্বাচিত ক্রমে নির্বাচিত প্রতিটি ক্ষেত্রের দ্বারা গ্রুপিং করার সমান।

অর্থাৎ,

select distinct a, b, c from table;

হিসাবে একই:

select a, b, c from table group by a, b, c

রাজি হয়েছে, তবে এটি কি সি, বি, সি, বি, সি দ্বারা টেবিল গ্রুপ থেকে একটি হিসাবে সমান হবে
ধীর

হ্যাঁ, এটি একই হবে
Caius Jard

0

কার্যকরী দক্ষতা সম্পূর্ণ আলাদা। আপনি যদি সদৃশ ব্যতীত কেবলমাত্র "রিটার্ন মান" নির্বাচন করতে চান, তবে পৃথক ব্যবহারটি গ্রুপ অনুসারে আরও ভাল। যেহেতু "গোষ্ঠী দ্বারা" অন্তর্ভুক্ত (বাছাই + অপসারণ), "স্বতন্ত্র" অন্তর্ভুক্ত (অপসারণ)



0

কখনও কখনও তারা আপনাকে একই ফলাফল দিতে পারে তবে সেগুলি বিভিন্ন অর্থে / ক্ষেত্রে ব্যবহৃত হতে বোঝায়। মূল পার্থক্য সিনট্যাক্স মধ্যে।

নীচের উদাহরণটি সামান্যভাবে লক্ষ্য করুন। DISTINCTমানগুলির সদৃশ সেট ফিল্টার আউট ব্যবহার করা হয়। (6, সিসি, 9.1) এবং (1, সিসি, 5.5) দুটি আলাদা সেট। সুতরাং DISTINCTউভয় সারি GROUP BY Branchপ্রদর্শিত যাচ্ছে যখন কেবল একটি সেট প্রদর্শন করতে যাচ্ছে।

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

কখনও কখনও GROUP BYক্লজ দ্বারা প্রাপ্ত ফলাফলগুলি অর্জন করা সম্ভব হয় নাDISTINCT কিছু অতিরিক্ত ধারা বা শর্ত না ব্যবহার করে । উদাহরণস্বরূপ উপরের ক্ষেত্রে।

একই ফল পেতে DISTINCTআপনাকে GROUP BYনীচের মতো দফায় সমস্ত কলামের নামটি পাস করতে হবে । সুতরাং সিনট্যাক্টিকাল পার্থক্য দেখুন। সেক্ষেত্রে GROUP BYধারাটি ব্যবহার করতে আপনার অবশ্যই সমস্ত কলামের নাম সম্পর্কে জ্ঞান থাকতে হবে ।

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

এছাড়াও আমি লক্ষ্য করেছি GROUP BYডিফল্টরূপে আরোহী ক্রমে ফলাফলগুলি প্রদর্শন করে যা DISTINCTনা হয়। তবে আমি এই সম্পর্কে নিশ্চিত নই। এটি ভিন্ন ভিন্ন বিক্রেতা হতে পারে।

সূত্র: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with- উদাহরণ সহকারে# group- by


0

সাধারণত আমরা DISTINCTটেবিলের নির্দিষ্ট কলামে সদৃশগুলি মুছে ফেলার জন্য ব্যবহার করতে পারি ।

'দল' এর ক্ষেত্রে আমরা মত সমষ্টি কার্যক্রম প্রয়োগ করতে পারেন AVG, MAX, MIN, SUM, এবং COUNTনির্দিষ্ট কলামের উপর এবং কলাম নাম আনা এবং এটি একই কলামে অ্যাগ্রিগেশন ফাংশন ফলাফল।

উদাহরণ:

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

-1

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

সহজ উদাহরণ চেষ্টা করুন

@ টেম্প্রেসাল্ট টেবিল (আইডি টিনিনেন্ট) ঘোষণা করুন

@ টেম্প্রেসাল্টে sertোকান 5 ইউনিয়ন নির্বাচন করুন 2 ইউনিয়ন নির্বাচন করুন 3 ইউনিয়ন নির্বাচন করুন সমস্ত নির্বাচন করুন 4

@ টেম্প্রেসাল্ট থেকে স্বতন্ত্র আইডি নির্বাচন করুন


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