কীভাবে এসকিউএল দ্বারা অনন্য রেকর্ড নির্বাচন করবেন


89

আমি যখন "সারণী থেকে * নির্বাচন করুন" সম্পাদন করি তখন নীচের মতো ফলাফল পেয়েছি:

1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4

আপনি দেখতে পাচ্ছেন, কলাম 2 (আইটেম 1 ডুপ হয়) থেকে ডুপ রেকর্ড রয়েছে। সুতরাং আমি কীভাবে এই জাতীয় ফলাফল পেতে পারি:

1 item1 data1
2 item2 data3
3 item3 data4

বাকী অনন্য রেকর্ডের সাথে ডুপ্লিকেট থেকে কেবল একটি রেকর্ড ফিরিয়ে আনা হয়।


আইটেম 1 প্রযুক্তিগতভাবে সদৃশ নয়। হিসাবে দেখানো হয়েছে, সারি 1 এবং 2 স্বতন্ত্র পর্যবেক্ষণ। আপনি যদি সারি 1 না করে সারি 2 রাখতে চান?
সাইবারনেটিক

উত্তর:


107

সঙ্গে distinctএকক এবং একাধিক কলাম নামের সাথে শব্দ, আপনি স্বতন্ত্র রেকর্ড পাবেন:

SELECT DISTINCT column 1, column 2, ...
FROM table_name;

15
উত্তরটি কি ভুল হতে পারে? DISTINCT সমস্ত নির্বাচিত কলামগুলিতে প্রয়োগ করা হয় (কমপক্ষে একটি DB2 এ), যা এখনও স্বতন্ত্র কলামগুলিতে সদৃশ মানগুলি প্রদান করবে।
কনস্টান্টিন


11

এটি প্রতিটি অনন্য আইটেমের জন্য আপনি কোন রোনে ফিরে যেতে চান তার উপর নির্ভর করে। আপনার ডেটা মনে হয় এসকিউএল সার্ভারের জন্য এই ক্ষেত্রে ন্যূনতম ডেটা মানটিকে ইঙ্গিত করে।

SELECT item, min(data)
FROM  table
GROUP BY item

11

আপনি ব্যবহার করতে পারেন 4 টি পদ্ধতি:

  1. DISTINCT
  2. গ্রুপ দ্বারা
  3. সাবকিউরি
  4. ROW_NUMBER () সহ সাধারণ সারণী এক্সপ্রেশন (সিটিই)

TABLEপরীক্ষার ডেটা সহ নিম্নলিখিত নমুনাটি বিবেচনা করুন :

/** Create test table */
CREATE TEMPORARY TABLE dupes(word text, num int, id int);

/** Add test data with duplicates */
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
      ,('bbb', 200, 2)
      ,('ccc', 300, 3)
      ,('bbb', 400, 4)
      ,('bbb', 200, 5)     -- duplicate
      ,('ccc', 300, 6)     -- duplicate
      ,('ddd', 400, 7)
      ,('bbb', 400, 8)     -- duplicate
      ,('aaa', 100, 9)     -- duplicate
      ,('ccc', 300, 10);   -- duplicate

বিকল্প 1: নির্বাচন নির্বাচন করুন

এটি সর্বাধিক সহজ এবং সোজা এগিয়ে, তবে সীমাবদ্ধতম উপায়:

SELECT DISTINCT word, num 
FROM    dupes
ORDER BY word, num;

/*
word|num|
----|---|
aaa |100|
bbb |200|
bbb |400|
ccc |300|
ddd |400|
*/

বিকল্প 2: গ্রুপ দ্বারা

গোষ্ঠীবদ্ধ আপনি সমষ্টিগত তথ্য যোগ করার জন্য, মত দেয় min(id), max(id), count(*), ইত্যাদি:

SELECT  word, num, min(id), max(id), count(*)
FROM    dupes
GROUP BY word, num
ORDER BY word, num;

/*
word|num|min|max|count|
----|---|---|---|-----|
aaa |100|  1|  9|    2|
bbb |200|  2|  5|    2|
bbb |400|  4|  8|    2|
ccc |300|  3| 10|    3|
ddd |400|  7|  7|    1|
*/

বিকল্প 3: উপশক্তি

সাবকিউরি ব্যবহার করে, আপনি প্রথমে অনুলিপি করার জন্য সদৃশ সারিগুলি সনাক্ত করতে পারেন, এবং তারপরে এগুলি WHERE NOT IN (subquery)নির্মাণের সাথে বাহ্যিক ক্যোয়ারিতে ফিল্টার করতে পারেন :

/** Find the higher id values of duplicates, distinct only added for clarity */
    SELECT  distinct d2.id
    FROM    dupes d1
        INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
    WHERE d2.id > d1.id

/*
id|
--|
 5|
 6|
 8|
 9|
10|
*/

/** Use the previous query in a subquery to exclude the dupliates with higher id values */
SELECT  *
FROM    dupes
WHERE   id NOT IN (
    SELECT  d2.id
    FROM    dupes d1
        INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
    WHERE d2.id > d1.id
)
ORDER BY word, num;

/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/

বিকল্প 4: ROW_NUMBER () সহ সাধারণ সারণী এক্সপ্রেশন

সাধারণ সারণী এক্সপ্রেশন (সিটিই) এ, গ্রুপ কলাম দ্বারা বিভাজনিত এবং পছন্দসই ক্রমে অর্ডার করা ROW_NUMBER () নির্বাচন করুন। তারপরে কেবলমাত্র রেকর্ডগুলি নির্বাচন করুন ROW_NUMBER() = 1:

WITH CTE AS (
    SELECT  *
           ,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
    FROM    dupes
)
SELECT  word, num, id 
FROM    cte
WHERE   row_num = 1
ORDER BY word, num;

/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/

6

কেবল অভ্যন্তরীণ যোগ দিন ব্যবহার করুন কারণ গোষ্ঠী অনুসারে একাধিক কলামের সাথে কাজ করবে না যা বলছে কোনও সামগ্রিক ফাংশনে অন্তর্ভুক্ত নেই।

SELECT a.*
FROM yourtable a
INNER JOIN 
  (SELECT yourcolumn,
    MIN(id) as id
  FROM yourtable 
  GROUP BY yourcolumn
) AS b
  ON a.yourcolumn= b.yourcolumn
  AND a.id = b.id;

এটি একটি পৃথক প্রশ্নের উত্তর, সম্ভবত এমন একটি যা সর্বাধিক-এন-প্রতি-গ্রুপের
a_horse_with_no_name

এটি এবং ডেভ বেকারের সমাধান এসও প্রশ্নের সঠিক সমাধান। এই সমাধানটির সুবিধাটি হ'ল এটি সুনির্দিষ্ট কয়েকটি নির্দিষ্ট কলাম সহ সারিগুলি নির্বাচন করতে দেয় এবং একাধিক নির্দিষ্ট কলামগুলির মধ্যে একটি নির্দিষ্ট করতে কলাম এমআইএন (আইডি) এএস আইডি সংজ্ঞায়িত করতে হয়।
জিওর্ডানো

1

আমি দেখতে পেয়েছি যে আমি যদি কোনও কারণে DISTINCT ব্যবহার করতে না পারি তবে গ্রুপ বাই কাজ করবে।


1

আপনার ফলস্বরূপ সমস্ত কলাম পেতে আপনাকে এমন কিছু রাখতে হবে:

SELECT distinct a, Table.* FROM Table

এটি প্রথম কলাম হিসাবে একটি স্থাপন করবে এবং বাকিটি আপনার সংজ্ঞার মতো একই ক্রমে সমস্ত কলাম থাকবে। এটি, কলাম একটি পুনরাবৃত্তি হবে।


4
আপনি যদি এই বিষয়ে নিশ্চিত? আমি ডাব্লু 3 স্কুলগুলিতে এটি চেষ্টা করেছি এবং এটি প্রথম নির্বাচন হিসাবে কেবল SELECT * হিসাবে ফিরে এসেছে
ফ্রেইকিশালি

@ ফ্র্যাঙ্কিশালি হ্যাঁ এবং এটিই বলে যা এটি আমার উত্তরে করবে: /
htafoya

এটি কাজ করবে না, আপনি * এর মতো স্বতন্ত্রতার পরে নির্বাচন করতে পারবেন না (আপনি একটি 1064 ত্রুটি পাবেন - আপনার এসকিউএল সিনট্যাক্সে ত্রুটি হবে)
টিম.বেকার

@ মহসিংহান ভালভাবেই আমি রাখতে ভুলে গেছি যে আপনাকে টেবিলের নাম লিখতে হবে। একরকম যখন আমি এটি লিখেছিলাম এটি কাজ করেছিল তবে আমি এখনই পরীক্ষা করেছি এবং এটি *
htafoya

4
এটি ঠিক select distinct * from ...
হ'ল

-4

এবিসি থেকে CO_E_DIM - এফ_এসটি নির্বাচন করুন (ইএফএফপিপি, ROW_NUMBER () দ্বারা ওভার (পার্টিশন বাই এফ_স্টের পার্টিশন) এক্সওয়াইজেড - নির্বাচন করুন

) যেখানে XFZ = 1 অর্ডার EFF_ST দ্বারা কেবল প্রথম 5 সারি নিয়ে আসে

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