একটি কলামে DISTINCT নির্বাচন করুন


258

এসকিউএল সার্ভার ব্যবহার করে আমার কাছে ...

ID  SKU     PRODUCT
=======================
1   FOO-23  Orange
2   BAR-23  Orange
3   FOO-24  Apple
4   FOO-25  Orange

আমি চাই

1   FOO-23  Orange
3   FOO-24  Apple

এই ক্যোয়ারী আমাকে সেখানে পাচ্ছে না। আমি কীভাবে কেবল একটি কলামে DISTINCT নির্বাচন করতে পারি?

SELECT 
[ID],[SKU],[PRODUCT]
FROM [TestData] 
WHERE ([PRODUCT] = 
(SELECT DISTINCT [PRODUCT] FROM [TestData] WHERE ([SKU] LIKE 'FOO-%')) 
ORDER BY [ID]

1
আমরা কি ধরে নিতে পারি যে এসকিউ কলামের ডেটাতে আপনি প্রত্যয়টির বিষয়ে চিন্তা করেন না? IE, আপনি কেবল "FOO-" সম্পর্কে যত্নবান এবং "FOO-xx" নয়
কেন 18

3
অন্যান্য মানগুলির তুলনায় আইডি = 1, এসকিউ = FOO-23 বেছে নেওয়ার জন্য আপনার যুক্তি কী? আইডি = 1 এর জন্য সুনির্দিষ্টভাবে উত্তর দেয় এমন একটি ক্যোয়ারী তৈরি করা সহজ তবে সাধারণ মামলায় ব্যর্থ হয়
gbn

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

উত্তর:


323

ধরে নিই যে আপনি এসকিউএল সার্ভার ২০০৫ বা তার বেশি রয়েছে, আপনি ROW_NUMBER () দিয়ে একটি সিটিই ব্যবহার করতে পারেন:

SELECT  *
FROM    (SELECT ID, SKU, Product,
                ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowNumber
         FROM   MyTable
         WHERE  SKU LIKE 'FOO%') AS a
WHERE   a.RowNumber = 1

37
আপনি আপনার ক্যোয়ারিতে কোনও সিটিই ব্যবহার করছেন না । এটি কেবল একটি উত্পন্ন টেবিল। তবে আপনি ঠিক বলেছেন যে আপনি এখানে একটি সিটিই ব্যবহার করতে পারতেন
মার্ক বাইয়ার্স

ওরাকলের জন্য "এএস" ছেড়ে দিন -> ... যেখানে 'স্কু'র মতো' ফু '% আছে) যেখানে a.RowNumber = 1
আন্দ্রে নেল

এটি সিটিই না হলেও এটি কাজ করে (; সিটিই সহ ......)। অভ্যন্তরীণভাবে পার্টিশন সহ উপ-কোয়েরি আরও ....
ব্যবহারকারীর 274294

এটি যে কোনও বিভিন্ন সদৃশ ক্ষেত্রে সত্যিই দরকারী কেস আপনাকে ধন্যবাদ
ASLIM

42

সবচেয়ে সহজ সমাধান হ'ল আপনার ক্যোয়ারীর সাথে মিলে ন্যূনতম আইডি সন্ধানের জন্য একটি সাবকোয়ারি ব্যবহার করা। সাবকিউয়ের GROUP BYপরিবর্তে আপনি ব্যবহার করুন DISTINCT:

SELECT * FROM [TestData] WHERE [ID] IN (
   SELECT MIN([ID]) FROM [TestData]
   WHERE [SKU] LIKE 'FOO-%'
   GROUP BY [PRODUCT]
)

13

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

SELECT 
    t.*
    FROM TestData t
        INNER JOIN (SELECT
                        MIN(ID) as MinID
                        FROM TestData
                        WHERE SKU LIKE 'FOO-%'
                   ) dt ON t.ID=dt.MinID


একবার সম্পাদনা সম্পাদনা করুন যখন ওপেন তার নমুনা আউটপুট সংশোধন করে (পূর্বে কেবলমাত্র এক ফলাফলের সারি ছিল, এখন সমস্ত দেখানো হয়েছে), এটি সঠিক ক্যোয়ারী:

declare @TestData table (ID int, sku char(6), product varchar(15))
insert into @TestData values (1 ,  'FOO-23'      ,'Orange')
insert into @TestData values (2 ,  'BAR-23'      ,'Orange')
insert into @TestData values (3 ,  'FOO-24'      ,'Apple')
insert into @TestData values (4 ,  'FOO-25'      ,'Orange')

--basically the same as @Aaron Alton's answer:
SELECT
    dt.ID, dt.SKU, dt.Product
    FROM (SELECT
              ID, SKU, Product, ROW_NUMBER() OVER (PARTITION BY PRODUCT ORDER BY ID) AS RowID
              FROM @TestData
              WHERE  SKU LIKE 'FOO-%'
         ) AS dt
    WHERE dt.RowID=1
    ORDER BY dt.ID

8
SELECT min (id) AS 'ID', min(sku) AS 'SKU', Product
    FROM TestData
    WHERE sku LIKE 'FOO%' -- If you want only the sku that matchs with FOO%
    GROUP BY product 
    ORDER BY 'ID'

3
এটি +1 এ যাচ্ছিল, কারণ আমি মনে করি গ্রোপ বাই গ্রাথ হ'ল সঠিক উপায় - তবে ন্যূনতম আইডি এবং সর্বনিম্ন এসকিউ একই রেকর্ডের সাথে সম্পর্কিত হতে পারে না। কোনও প্রদত্ত পণ্যটির জন্য সঠিক আইডি এবং এসকিউ রিপোর্ট করার জন্য এটি নির্ধারণ করা শক্ত।
কার্ল ম্যানাস্টার

8

আমি জানি এটি 6 বছর আগে জিজ্ঞাসা করা হয়েছিল, কিন্তু জ্ঞান এখনও জ্ঞান। এটি সর্বোপরির তুলনায় ভিন্ন সমাধান, কারণ আমাকে এটি এসকিউএল সার্ভার 2000 এর অধীনে চালাতে হয়েছিল:

DECLARE @TestData TABLE([ID] int, [SKU] char(6), [Product] varchar(15))
INSERT INTO @TestData values (1 ,'FOO-23', 'Orange')
INSERT INTO @TestData values (2 ,'BAR-23', 'Orange')
INSERT INTO @TestData values (3 ,'FOO-24', 'Apple')
INSERT INTO @TestData values (4 ,'FOO-25', 'Orange')

SELECT DISTINCT  [ID] = ( SELECT TOP 1 [ID]  FROM @TestData Y WHERE Y.[Product] = X.[Product])
                ,[SKU]= ( SELECT TOP 1 [SKU] FROM @TestData Y WHERE Y.[Product] = X.[Product])
                ,[PRODUCT] 
            FROM @TestData X  

0

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

WITH [TestData]([ID],[SKU],[PRODUCT]) AS
(
    SELECT *
    FROM (
        VALUES
        (1,   'FOO-23',  'Orange'),
        (2,   'BAR-23',  'Orange'),
        (3,   'FOO-24',  'Apple'),
        (4,   'FOO-25',  'Orange')
    )
    AS [TestData]([ID],[SKU],[PRODUCT])
)

SELECT * FROM [TestData] WHERE [ID] IN 
(
    SELECT MIN([ID]) 
    FROM [TestData] 
    GROUP BY [PRODUCT]
)

ফলাফল

ID  SKU     PRODUCT
1   FOO-23  Orange
3   FOO-24  Apple

আমি নিম্নলিখিত উপেক্ষা করেছি ...

WHERE ([SKU] LIKE 'FOO-%')

এটি লেখকের ত্রুটিযুক্ত কোডের একমাত্র অংশ হিসাবে এবং প্রশ্নের অংশ নয়। এখানে দেখার লোকদের পক্ষে এটি সহায়ক হওয়ার সম্ভাবনা কম।


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