একই নির্বাচনী বিবৃতিতে কীভাবে DISTINCT এবং অর্ডার ব্যবহার করবেন?


116

নিম্নলিখিত বিবৃতি কার্যকর করার পরে:

SELECT  Category  FROM MonitoringJob ORDER BY CreationDate DESC

আমি ডাটাবেস থেকে নিম্নলিখিত মানগুলি পাচ্ছি:

test3
test3
bildung
test4
test3
test2
test1

তবে আমি এইগুলি সদৃশগুলি মুছে ফেলতে চাই:

bildung
test4
test3
test2
test1

আমি DISTINCT ব্যবহার করার চেষ্টা করেছি কিন্তু এটি একটি বিবৃতিতে অর্ডার দিয়ে কাজ করে না। সাহায্য করুন.

গুরুত্বপূর্ণ:

  1. আমি এটি দিয়ে চেষ্টা করেছি:

    SELECT DISTINCT Category FROM MonitoringJob ORDER BY CreationDate DESC

    এটা কাজ করে না।

  2. ক্রিয়েশনডেট দ্বারা অর্ডার করা খুব গুরুত্বপূর্ণ।


1
এটা কিভাবে কাজ করে না? ভুল আউটপুট?
ফেডার্ন

উত্তর:


194

সমস্যাটি হ'ল ব্যবহৃত কলামগুলি ORDER BYসুনির্দিষ্টভাবে নির্দিষ্ট করা হয়নি DISTINCT। এটি করার জন্য, আপনার বাছাই করার জন্য একটি সামগ্রিক ফাংশন ব্যবহার GROUP BYকরতে হবে এবং DISTINCTকাজটি করতে একটি ব্যবহার করতে হবে ।

এরকম কিছু চেষ্টা করুন:

SELECT DISTINCT Category, MAX(CreationDate) 
FROM MonitoringJob 
GROUP BY Category 
ORDER BY MAX(CreationDate) DESC, Category

98
এমনকি আপনি বিভাগ অনুসারে গ্রুপ করে দিলে আপনার এমনকি DISTINCT কীওয়ার্ডের দরকার নেই।
ম্যাটবেইলি

18

প্রসারিত বাছাই কী কলামগুলি

আপনি যে কাজটি করতে চান তা হ'ল কারণটি এসকিউএল-এর ক্রিয়াকলাপের যৌক্তিক ক্রম যা আপনার প্রথম ক্যোয়ারির জন্য (সরলীকৃত):

  • FROM MonitoringJob
  • SELECT Category, CreationDateঅর্থাত্ একটি তথাকথিত বর্ধিত বাছাই কী কলামটি যুক্ত করুন
  • ORDER BY CreationDate DESC
  • SELECT Categoryঅর্থাত্ পুনরায় ফলাফল থেকে প্রসারিত সাজানোর কী কলামটি সরান

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

সুতরাং, কেন এই কাজ করে না DISTINCT?

আমরা যোগ তাহলে DISTINCTঅপারেশন, এটা মধ্যে যোগ করা হবে SELECTএবং ORDER BY:

  • FROM MonitoringJob
  • SELECT Category, CreationDate
  • DISTINCT
  • ORDER BY CreationDate DESC
  • SELECT Category

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

সমাধান নীচে উপস্থিত

এটি নিম্নোক্তভাবে স্ট্যান্ডার্ড সিনট্যাক্স দিয়ে অনুকরণ করা যায়

SELECT Category
FROM (
  SELECT Category, MAX(CreationDate) AS CreationDate
  FROM MonitoringJob
  GROUP BY Category
) t
ORDER BY CreationDate DESC

বা, কেবল সহজভাবে (এই ক্ষেত্রে), যেমন প্রুটউন্ডার দেখিয়েছেন

SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC

আমি এখানে এসকিউএল ডিসটিন্ট এবং আরও বিস্তারিতভাবে অর্ডার দিয়ে ব্লগ করেছি


1
আমি মনে করি আপনি কীভাবে DISTINCT ONকাজ করে এবং এটি নিশ্চিতভাবে কার্যকর হয় না সে সম্পর্কে আপনারা ভুল করেছেন । বন্ধনীতে প্রকাশটি হ'ল স্বতন্ত্রতা (গ্রুপিংয়ের অবস্থা) নির্ধারণ করতে ব্যবহৃত হয়। যদি একই সাথে বিভিন্ন বিভাগ থাকে তবে CreationDateতার মধ্যে কেবল একটির ফলাফল প্রদর্শিত হবে! যেহেতু আমি ভাবছিলাম যে সম্ভবত আমার কোনও ভুল ছিল কিনা, তাই আমি আপনার ব্লগ পোস্টে উদাহরণস্বরূপ ডাটাবেসটিও ডাবল-চেক করতে লোড করেছি: আপনি যে DISTINCT ONপ্রশ্নটি দিয়েছিলেন সেখানে মোট 1000 টি ফলাফল (প্রচুর নকলের সাথে length) উত্পাদিত হয়েছে যখন এর নীচের ক্যোয়ারী দিয়েছে শুধুমাত্র 140 (অনন্য) মান।
ইনক্লিং

@ ইনক্লিং: আপনার সময়ের জন্য ধন্যবাদ ওপি স্পষ্টতই "সদৃশ" মুছে ফেলতে চায়। ওপি'র শব্দবন্ধটি দেখুন "তবে আমি এর মতো সদৃশ অপসারণ করতে চাই" । আমার ব্লগ পোস্ট থেকে প্রশ্নগুলি অনুলিপি করার সময় আপনি সম্ভবত একটি ভুল করেছেন। দুটি প্রশ্ন রয়েছে, একটি যা ব্যবহার করে DISTINCT(না ON) এবং যেটি ব্যবহার করে DISTINCT ON। অনুগ্রহ করে লক্ষ্য করুন যে পরবর্তীকৃতগুলি স্পষ্টভাবে সদৃশ দৈর্ঘ্যগুলি সরায় না, তবে শিরোনামের শিরোনাম। আমি মনে করি যে এখানে আমার উত্তর সম্পূর্ণ সঠিক।
লুকাস এদার

1
আমার বক্তব্যটি হ'ল আপনার DISTINCT ONশর্তগুলি ভুল শর্তটি ব্যবহার করে সদৃশগুলি সরিয়ে দিচ্ছে। আপনার ব্লগ পোস্টে DISTINCT ONক্যোয়ারী সত্যই সদৃশ শিরোনামগুলি সরিয়ে ফেলবে , তবে DISTINCTএটির উপরে থাকা ক্যোয়ারী এবং এর নীচের ক্যোয়ারী (যে আপনি দাবি করেন যে এটি "সিনট্যাক্স চিনি" এর জন্য) উভয়ই নকল সরান দৈর্ঘ্য , সম্ভবত এটিই পুরো লক্ষ্য। একই জিনিস এখানে প্রযোজ্য: ওপি ডুপ্লিকেট চায় ধরন সরিয়ে সদৃশ নয় CreationDates যেমন DISTINCT ONক্যোয়ারী আছে। আপনি যদি এখনও আমাকে বিশ্বাস না করেন তবে নিজের জন্য পরীক্ষা করুন।
ইঙ্কলিং

6

যদি ম্যাক্সের (ক্রিয়েশনডেট) আউটপুটটি না চাওয়া হয় - যেমন মূল প্রশ্নের উদাহরণ হিসাবে - একমাত্র উত্তরটি প্রশান্ত গুপ্তের উত্তরের দ্বিতীয় বিবৃতি:

SELECT [Category] FROM [MonitoringJob] 
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC

ব্যাখ্যা: আপনি একটি ইনলাইন ফাংশনে অর্ডার বাই ধারাটি ব্যবহার করতে পারবেন না, সুতরাং প্রসূনসন্ডারের উত্তরের বিবৃতি এই ক্ষেত্রে ব্যবহারযোগ্য নয়, আপনি এটির চারপাশে একটি বহিরাগত নির্বাচন রাখতে পারবেন না এবং ম্যাক্স (ক্রিয়েশনডেট) অংশটি বাতিল করতে পারবেন না।


2

কেবলমাত্র এই কোডটি ব্যবহার করুন, যদি আপনি [বিভাগ] এবং [ক্রিয়েশনডেট] কলামগুলির মান চান

SELECT [Category], MAX([CreationDate]) FROM [MonitoringJob] 
             GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC

অথবা এই কোডটি ব্যবহার করুন, যদি আপনি কেবল [বিভাগ] কলামের মান চান।

SELECT [Category] FROM [MonitoringJob] 
GROUP BY [Category] ORDER BY MAX([CreationDate]) DESC

আপনি যা চান তার সবকটি আলাদা রেকর্ড থাকবে।


এই ধননীগুলি [] সম্পূর্ণ বিভ্রান্তিকর ... এটি কি বৈধ এসকিউএল সিনট্যাক্স?
এম

1
বন্ধনীগুলি হ'ল কীওয়ার্ডগুলি যেমন অর্ডার, ইভেন্ট ইত্যাদি ইত্যাদির জন্য থাকে তাই আপনার যদি টেবিলের কোনও কলাম বলা হয় (উদাহরণস্বরূপ) Eventআপনি এসকিউএলকে বিশ্লেষণ ত্রুটি ছুঁড়ে দেওয়ার [Event]পরিবর্তে লিখতে পারেন Event
বেন ম্যাক্সফিল্ড 21

1

2) ক্রিয়েশনডেট দ্বারা অর্ডার করা খুব গুরুত্বপূর্ণ

মূল ফলাফল ইঙ্গিত দেয় যে "টেস্ট 3" এর একাধিক ফলাফল ছিল ...

গ্রুপ বাই এর ডুপ্লিকেটগুলি সরাতে সর্বদা ম্যাক্স ব্যবহার করা শুরু করা খুব সহজ ... এবং অন্তর্নিহিত প্রশ্নটি কী তা ভুলে যান বা উপেক্ষা করুন ...

ওপি সম্ভবত অনুধাবন করেছে যে ম্যাক্স ব্যবহার করা তাকে সর্বশেষ "তৈরি" দিচ্ছে এবং এমআইএন ব্যবহার করে প্রথম "তৈরি" দেওয়া হবে ...


3
এটি সত্যই প্রশ্নের উত্তর দেবে বলে মনে হয় না, এটি প্রশ্নের MAXউত্তর হিসাবে একা দাঁড়িয়ে থাকা এমন কোনও বিষয় না করে অন্য উত্তরদাতাদের ব্যবহারের বিষয়ে মন্তব্য বলে মনে হয় ।
ডেভিড্যাভ ডেভ

0
if object_id ('tempdb..#tempreport') is not null
begin  
drop table #tempreport
end 
create table #tempreport (
Category  nvarchar(510),
CreationDate smallint )
insert into #tempreport 
select distinct Category from MonitoringJob (nolock) 
select * from #tempreport  ORDER BY CreationDate DESC

0

সাবকিউরি দ্বারা, এটি কাজ করা উচিত:

    SELECT distinct(Category) from MonitoringJob  where Category in(select Category from MonitoringJob order by CreationDate desc);

উম্মম ... আমি মনে করি না এটা হবে। বাইরের নির্বাচন বাছাই করা হয় না।
হোসাম এল-দ্বীন

এটি কাজ করবে না, আমি এখানে আছি কারণ এটি কাজ করছে না
আমিররেজা

-1

স্বতন্ত্র ক্রমগুলি রেকর্ডগুলি সাজিয়ে রাখবে ct আপনি যদি ডেস্ক অর্ডারটি বাছাই করতে চান তবে:

SELECT DISTINCT Category
FROM MonitoringJob
ORDER BY Category DESC

আপনি যদি ক্রিয়েশনডেট ফিল্ডের ভিত্তিতে রেকর্ডগুলি বাছাই করতে চান তবে এই ক্ষেত্রটি অবশ্যই নির্বাচনী বিবৃতিতে থাকতে হবে:

SELECT DISTINCT Category, creationDate
FROM MonitoringJob
ORDER BY CreationDate DESC

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

-1

আপনি সিটিই ব্যবহার করতে পারেন:

WITH DistinctMonitoringJob AS (
    SELECT DISTINCT Category Distinct_Category FROM MonitoringJob 
)

SELECT Distinct_Category 
FROM DistinctMonitoringJob 
ORDER BY Distinct_Category DESC

-3

পরবর্তী চেষ্টা করুন, তবে এটি বিশাল ডেটার জন্য কার্যকর নয় ...

SELECT DISTINCT Cat FROM (
  SELECT Category as Cat FROM MonitoringJob ORDER BY CreationDate DESC
);

4
"অর্ডার বাই ক্লজটি ভিউ, ইনলাইন ফাংশন, উত্সযুক্ত টেবিল, উপশক্তি এবং সাধারণ সারণী এক্সপ্রেশনগুলিতে অবৈধ, যদি না শীর্ষস্থানীয় বা এক্সএমএল নির্দিষ্ট না করা হয়।"
টেকপ্লেক্সএন্জিনিয়ার

এটি কাজ করে না কারণ আপনি ক্রমে ক্রিয়েশন তারিখটি ক্রমটি নির্দিষ্ট করে নি।
মাউরো বিলোটি

1
@ টেকপ্লেক্সএঞ্জাইনার আপনার মন্তব্যটি ভুল। ORDER BYসাব-কোয়েরিতে ব্যবহার করা সম্পূর্ণ বৈধ। এবং কেউ কেউ আপনার ভুল মন্তব্যটি আপ-ভোট দিয়েছে।
র্যাকিল হিলান

আমি এটি চেষ্টা করছি এবং @ টেকপ্লেক্সএঞ্জাইনারের সাথে একই ত্রুটি ঘটছে। আমি যখন ক্ষেত্রে কাস্টম অর্ডার ব্যবহার করছি।
এজ বায়ারাক

-4

এটি অভ্যন্তরীণ কোয়েরি ব্যবহার করে এটি করা যেতে পারে

$query = "SELECT * 
            FROM (SELECT Category  
                FROM currency_rates                 
                ORDER BY id DESC) as rows               
            GROUP BY currency";

-5
SELECT DISTINCT Category FROM MonitoringJob ORDER BY Category ASC

2
আমার এটি তৈরির তারিখ অনুসারে বাছাই করা দরকার !! এটা খুবই গুরুত্বপূর্ণ
RR

তাহলে আপনি নিজের দ্বারা কলামটি যুক্ত করতে চান সেগুলি যুক্ত করা কি অসম্ভব? আপনার উদাহরণটি বর্ণমালা অনুসারে এন্ট্রিগুলি দেখিয়েছে। আপনার তৈরি তারিখ অনুসারে যদি অর্ডার করতে হয় তবে কেবল এটি যুক্ত করুন। এটি আসলেই এতটা কঠিন নয়।
ফুরিকান

8
-১: ওপি চেষ্টা করেছিল, এটি কাজ করে না, কারণ এটি অসম্ভব এবং ওপিকে পৃষ্ঠপোষকতার সময় আপনি সেই বাস্তবতাকে দৃশ্যত উপেক্ষা করেছেন। মুল বক্তব্যটি হ'ল ডিআইএসটিএনসিটি অপারেটর একই বিভাগের মান সহ বিভিন্ন রেকর্ডের কোলিট করবে, যার প্রতিটি সম্ভাব্য ভিন্ন ভিন্ন রূপের তারিখ রয়েছে। সুতরাং DISTINCT ব্যবহার করার সময় এটি যৌক্তিকভাবে অসম্ভব। এটি নির্ধারণের তারিখে সামগ্রিক (MAX) মঞ্জুরি দিয়ে DISTINCT এর পরিবর্তে একটি GROUP BY এ প্রয়োজনীয় যুক্তিটি পুশ করে।
ম্যাটবেইলি

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

8
আপনি সরাসরি ক্রিয়েশনডেট ফিল্ড যুক্ত করার পরামর্শ দিচ্ছেন, এমনকি "এটি সত্যিই এতটা কঠিন নয়" বলেও ফেলেন। এটি করার ফলে ত্রুটিযুক্ত এসকিউএল পাওয়া যায়। ওপিকে পৃষ্ঠপোষকতা করার জন্য -১ পেয়েছিলেন, এমন পরামর্শ দিয়েছেন যা ওপিকে তিনি মূলত পোস্ট করেছেন যে বিবৃতিটি ফিরিয়ে নিয়েছে, এবং DISTINCT এর মধ্যে মতবিরোধ খেয়াল করতে ব্যর্থ হয়েছে এবং DISTINCT এ নয় এমন একটি ক্ষেত্র দ্বারা অর্ডার দেবে। অতিরিক্ত হিসাবে, 'বি' 'টি' এর আগে আসে, এবং '1' '4' এর আগে আসে, এইভাবে ওপি প্রদত্ত ফলাফলগুলি বর্ণানুক্রমিকভাবে নয় or আমি তখন আপনার নিজের পরামর্শ পরামর্শ দিতে পারি: পরের বার পড়ুন (আরও সাবধানে)।
ম্যাটবেইলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.