কেবলমাত্র সদৃশ অপসারণ কার্যকারিতা বিন্দু থেকে পার্থক্য কি
এছাড়াও যে অসদৃশ থেকে DISTINCT
, GROUP BY
ডেটা সমষ্টি জন্য করতে পারবেন গ্রুপ প্রতি (অন্যান্য অনেক উত্তর উল্লেখ করা হয়েছে), আমার মতে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য যে দুটি অপারেশন দুটি খুব বিভিন্ন পদক্ষেপ এ "ঘটতে" হয় লজিক্যাল ক্রম অপারেশনগুলি যা একটি SELECT
বিবৃতিতে কার্যকর করা হয় ।
এখানে সর্বাধিক গুরুত্বপূর্ণ অপারেশন রয়েছে:
FROM
(সহ JOIN
, APPLY
ইত্যাদি)
WHERE
GROUP BY
(সদৃশ অপসারণ করতে পারেন)
- মোট পরিমাণ
HAVING
- উইন্ডো ফাংশন
SELECT
DISTINCT
(সদৃশ অপসারণ করতে পারেন)
UNION
, INTERSECT
, EXCEPT
(সদৃশ অপসারণ করতে পারেন)
ORDER BY
OFFSET
LIMIT
আপনি দেখতে পাচ্ছেন যে প্রতিটি অপারেশনের যৌক্তিক ক্রম এর সাথে কী করা যায় এবং পরবর্তী কাজগুলিকে কীভাবে প্রভাবিত করে তা প্রভাবিত করে। বিশেষত, GROUP BY
অপারেশন "SELECT
প্রক্ষেপণ " এর আগে " অপারেশনটি ঘটে" এর অর্থ এই যে:
- এটি প্রক্ষেপণের উপর নির্ভর করে না (যা কোনও সুবিধা হতে পারে)
- এটি অভিক্ষেপ থেকে কোনও মান ব্যবহার করতে পারে না (যা কোনও অসুবিধা হতে পারে)
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
আমি এই বিষয়ে আরও একটি ব্লগ পোস্টে গভীরতার সাথে লিখেছি