DISTINCT শুধুমাত্র একটি কলামের জন্য


155

ধরা যাক আমার নীচের প্রশ্নটি রয়েছে।

SELECT ID, Email, ProductName, ProductModel FROM Products

আমি এটি কীভাবে সংশোধন করতে পারি যাতে এটি কোনও সদৃশ ইমেলগুলি না দেয়?

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

ক্লোজগুলি পছন্দ করে DISTINCTএবং GROUP BYপুরো সারিগুলিতে কাজ করে বলে মনে হচ্ছে। সুতরাং আমি কীভাবে এটি পৌঁছাতে পারি তা নিশ্চিত নই।


2
ঠিক আছে, আপনার পার্টিশন ব্যবহার করতে হবে বা দুটি নির্বাচিত বিবৃতি ব্যবহার করতে হবে?
কার্নি কোড

এবং একই ইমেলের সাথে পৃথক প্রোডাক্টনামের সাথে 2 টি সারি থাকলে কী দেখানো উচিত? (বিশেষ গত এক) স্পষ্ট নয়। কোন অর্ডার দিয়ে শেষ?
ypercubeᵀᴹ

প্রশ্নে যেমনটি বলা হয়েছে @ টাইপ्यूब, ততটাই শেষ। তবে, এটি আমার কাছে সত্যই সমালোচিত নয় not আমি কেবল তাদের মধ্যে একটি চাই।
জোনাথন উড

1
আপনি নীচের প্রশ্নগুলি দেখতে পারেন: প্রশ্নাবলি 1 , প্রশ্ন 2 বা প্রশ্ন 3
মারিয়ান

আপনি কেন ব্যবহার করতে পারবেন না: নির্বাচন করুন ইমেল, আইডি, প্রোডাক্টনাম, পণ্য থেকে মডেল নির্বাচন করুন?
রিক হেন্ডারসন

উত্তর:


186

আপনি যদি এসকিউএল সার্ভার 2005 ব্যবহার করেন বা উপরের এটি ব্যবহার করুন:

SELECT *
  FROM (
                SELECT  ID, 
                        Email, 
                        ProductName, 
                        ProductModel,
                        ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
                    FROM Products
              ) a
WHERE rn = 1

সম্পাদনা: উদাহরণ যেখানে একটি ক্লজ ব্যবহার করে:

SELECT *
  FROM (
                SELECT  ID, 
                        Email, 
                        ProductName, 
                        ProductModel,
                        ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
                    FROM Products
                   WHERE ProductModel = 2
                     AND ProductName LIKE 'CYBER%'

              ) a
WHERE rn = 1

4
আমাকে অবশ্যই এই পার্টিশন ধারাটি তদন্ত করতে হবে, এর আগে কখনও এটিকে কার্যকর অবস্থায় দেখেনি। উদাহরণের জন্য ধন্যবাদ
LorenVS

@ সাইবারনেট ওয়ান জটিলতা: আমার অভ্যন্তরের SELECTএকটি WHEREশর্ত দরকার। আমি ভাবছি সারণির সমস্ত সারিতে সারি নম্বরগুলি বরাদ্দ করা হবে। এই বাক্য গঠনটি আমার থেকে কিছুটা দূরে। কোনও আপডেটের কোনও সুযোগ যা WHEREশর্ত পূরণ করে এমন একটি নির্দিষ্ট ইমেলের সাথে এক সারির গ্যারান্টি দেয় ?
জোনাথন উড

1
অভ্যন্তরীণ স্কয়ারে যেখানে ক্লজ যুক্ত করতে পারেন। আমি আমার ল্যাপটপটি একবার অ্যাক্সেস করতে
পারলে

1
যেখানে ক্লজ ব্যবহার করে একটি নমুনা সহ পোস্টটি আপডেট করেছেন।
চান্দু

1
আমার কোয়েরিতে কোনও JOIN এস না থাকলেই আমি এটি সঠিকভাবে কাজ করতে পারি। যত তাড়াতাড়ি আমার সাথে আছে JOIN, ROW_NUMBER"1" এর চেয়ে অনেক বেশি মানগুলি প্রদান করে।
উওয়ে কেইম

10

এটি এসকিউএল সার্ভার 2005+ ধরেছে এবং আপনার "শেষ" এর সংজ্ঞা প্রদত্ত ইমেলের জন্য সর্বাধিক পিকে

WITH CTE AS
(
SELECT ID, 
       Email, 
       ProductName, 
       ProductModel, 
       ROW_NUMBER() OVER (PARTITION BY Email ORDER BY ID DESC) AS RowNumber 
FROM   Products
)
SELECT ID, 
       Email, 
       ProductName, 
       ProductModel
FROM CTE 
WHERE RowNumber = 1

6

যখন আপনি DISTINCTএটিকে আলাদা আলাদা সারি হিসাবে মনে করেন, কলামটি নয়। এটি কেবলমাত্র সারিগুলিতে ফিরে আসবে যেখানে কলামগুলি একইরূপে মেলে না।

SELECT DISTINCT ID, Email, ProductName, ProductModel
FROM Products

----------------------
1 | something@something.com | ProductName1 | ProductModel1
2 | something@something.com | ProductName1 | ProductModel1

IDকলামটি উভয় সারি ফিরিয়ে আনবে কারণ কলামটি আলাদা। আমি ধরে নিচ্ছি যে IDকলামটি একটি IDENTITYকলাম যা বৃদ্ধি পাচ্ছে, যদি আপনি শেষটি ফিরে আসতে চান তবে আমি এই জাতীয় কিছু প্রস্তাব করছি:

SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel
FROM Products
ORDER BY ID DESC

TOP 1দ্বারা এটি ক্রম দ্বারা শুধুমাত্র প্রথম রেকর্ডের ফিরে আসবো, IDসাজানো এটা প্রথম শেষ সারি সঙ্গে ফলাফলগুলি নিয়ে আসবে। এটি আপনাকে সর্বশেষ রেকর্ড দেবে।


2
প্রশ্নে বর্ণিত হিসাবে, আমি দেখতে পাচ্ছি যে DISTINCT পুরো সারিতে কাজ করে। আপনি উপরের পরামর্শ মতো আমি এটি করতে চাই তবে প্রতিবারের জন্য ইমেলটি ফলাফলগুলিতে নকল হয় (কেবল একবার নয়)।
জোনাথন উড

সেক্ষেত্রে আমি @ সাইবারনেট উত্তর নিয়ে যাওয়ার পরামর্শ দেব। আপনার যা প্রয়োজন ঠিক তা করা উচিত।
jon3laze

4

গ্রুপ বাই ফাংশন ব্যবহার করে আপনি এটি অতিক্রম করতে পারেন

SELECT ID, Email, ProductName, ProductModel FROM Products GROUP BY Email


16
কলাম 'Products.ID' বাছাই তালিকায় অবৈধ কারণ এটি একটি সামগ্রিক ফাংশন বা গ্রুপ বাই দফা দ্বারা থাকে না।
পালোটা

2
অন্যান্য কলামগুলির জন্য MAX (ID), MAX (ProductName), MAX (ProductModel) এর মতো কিছু ব্যবহার না করে এটি কাজ করে না
avl_sweden

2
পোস্টগ্রিজগুলিতে আপনার কেবলমাত্র কলামে সামগ্রিক ফাংশন প্রয়োজন যা দলে দলে গ্রুপে ব্যবহৃত হবে, যেমন SELECT id, max(email) AS email FROM tbl GROUP by email। এসকিউএল সার্ভারে ধারাটিতে সমস্ত কলাম SELECTঅবশ্যই একটি সামগ্রিক ফাংশনে থাকতে হবে। আমি যখনই ফিরে যাই এটি প্রতিবার আমাকে কামড়ায়।
ব্রুস পাইর্সন

এটি কখনই কাজ করবে না। এটি একটি খারাপ সমাধান
ড্যান এএস

1

অ্যাক্সেসের জন্য, আপনি এখানে উপস্থাপিত এসকিউএল নির্বাচন জিজ্ঞাসাটি ব্যবহার করতে পারেন:

উদাহরণস্বরূপ আপনার এই টেবিলটি রয়েছে:

ক্লায়েন্ট || নাম্বার || মেল

888 || T800 আর্নল্ড || t800.arnold@cyberdyne.com

123 || জন কনার || s.connor@skynet.com

125 || সারাহ কনর ||s.connor@skynet.com

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

এসকিউএল নির্বাচন:

SELECT MAX(p.CLIENTE) AS ID_CLIENTE
, (SELECT TOP 1 x.NOMBRES 
    FROM Rep_Pre_Ene_MUESTRA AS x 
    WHERE x.MAIL=p.MAIL 
     AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE, 
p.MAIL
FROM Rep_Pre_Ene_MUESTRA AS p
GROUP BY p.MAIL;

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

এটি আপনার সাথে সম্পর্কিত তথ্য সহ সর্বোচ্চ আইডি নিয়ে আসবে, আপনি কমপক্ষে বা অন্য কোনও ফাংশন ব্যবহার করতে পারেন এবং আপনি সেই ফাংশনটিকে সাব-কোয়েরিতে প্রতিলিপি করুন।

এই নির্বাচনটি ফিরে আসবে:

ক্লায়েন্ট || নাম্বার || মেল

888 || T800 আর্নল্ড || t800.arnold@cyberdyne.com

125 || সারাহ কনর ||s.connor@skynet.com

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


0

পুরো সারিগুলির কারণ DISTINCTএবং GROUP BYকাজ হ'ল আপনার ক্যোয়ারী পুরো সারিগুলি ফেরত দেয়।

আপনাকে বুঝতে সাহায্য করার জন্য: কোয়েরিটি কী ফিরে আসবে তা হাত দিয়ে লেখার চেষ্টা করুন এবং আপনি দেখতে পাবেন যে নন-অনুলিপিযুক্ত কলামগুলিতে কী রাখা উচিত তা অস্পষ্ট।

আপনি যদি আক্ষরিকভাবে অন্যান্য কলামগুলির মধ্যে যত্ন না নিয়ে থাকেন তবে সেগুলি ফিরিয়ে দিন না। প্রতিটি ই-মেইল ঠিকানার জন্য একটি এলোমেলো সারি ফিরিয়ে দেওয়া আমার কাছে কিছুটা অকেজো মনে হয়।


@ জনফিক্স আমি পুরো সারিগুলি ফিরতে চাই। আমি ইচ্ছুক চাই না যে ফলাফলগুলি ইতিমধ্যে ইমেল কলামে একই মান সহ একটি সারি অন্তর্ভুক্ত করবে।
জোনাথন উড

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

6
আপনার যুক্তি অনুসরণ করতে আমার সত্যিই সমস্যা হচ্ছে। প্রশ্নে বর্ণিত হিসাবে, আমি শেষটি পছন্দ করব (আইডি অনুসারে বাছাই করা)। হ্যাঁ, যদি এটি একটি এলোমেলো সারিটি নির্বাচন করে তবে তা ঠিক আছে। এবং, হ্যাঁ, আমি এটি সম্পর্কে চিন্তাভাবনা করেছি।
জোনাথন উড


-2

এটা চেষ্টা কর:

SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)

2
কেন আমাদের এটি চেষ্টা করা উচিত? বিগত ৮ বছরে এখানে পোস্ট করা অন্যান্য উত্তরগুলির চেয়ে কেন এটি ভাল? আপনি যদি সমস্যাটি সমাধানের আরও ভাল উপায়ে ভাগ করতে চান তবে আপনি এটি কেন সুপারিশ করেন তা ব্যাখ্যা করা দরকার।
ধর্মমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.