নির্দিষ্ট ক্ষেত্রে সদৃশ খুঁজে পেতে বিবৃতি নির্বাচন করুন


415

আপনি একাধিক ক্ষেত্রে নকল পেতে এসকিউএল বিবৃতি সাহায্য করতে পারেন?

উদাহরণস্বরূপ, সিউডো কোডে:

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times

এবং উপরের বিবৃতি থেকে যদি একাধিক ঘটনা ঘটে থাকে তবে আমি প্রথমটি বাদে প্রতিটি রেকর্ড নির্বাচন করতে চাই ।


3
আপনার সিউডো কোডটি অস্পষ্ট, এবং আপনি প্রথমটি চান না সেই অনুযায়ী আপনি অর্ডার নির্ধারণ করেন না। আমি আপনাকে কিছু নমুনা তথ্য দেওয়ার পরামর্শ দিচ্ছি।
অবাস্তব

উত্তর:


840

একাধিক রেকর্ড রয়েছে এমন ক্ষেত্রগুলির তালিকা পেতে, আপনি ব্যবহার করতে পারেন ..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

সারিগুলি কীভাবে মুছবেন সে সম্পর্কে আরও তথ্যের জন্য এই লিঙ্কটি দেখুন।

http://support.microsoft.com/kb/139444

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


42

আপনি "প্রথমটি" উল্লেখ করেছেন, তাই আমি ধরে নিলাম যে আপনার ডেটাতে কিছুটা অর্ডার রয়েছে। আসুন ধরে নেওয়া যাক আপনার ডেটা কোনও ক্ষেত্র দ্বারা অর্ডার করা হয়েছেID

এই এসকিউএলটি আপনাকে প্রথমটি ব্যতীত ডুপ্লিকেট এন্ট্রি দেবে। এটি মূলত সমস্ত সারি নির্বাচন করে যার জন্য (ক) একই ক্ষেত্র এবং (খ) একটি নিম্ন আইডি উপস্থিত রয়েছে another পারফরম্যান্স দুর্দান্ত হবে না, তবে এটি আপনার সমস্যার সমাধান করতে পারে।

SELECT A.ID, A.field1, A.field2, A.field3
  FROM myTable A
 WHERE EXISTS (SELECT B.ID
                 FROM myTable B
                WHERE B.field1 = A.field1
                  AND B.field2 = A.field2
                  AND B.field3 = A.field3
                  AND B.ID < A.ID)

17

এটি আমার পছন্দ মতো এসকিউএল সার্ভার 2005 এর সাথে একটি মজাদার সমাধান। আমি ধরে নিচ্ছি যে "প্রথম রেকর্ড ব্যতীত প্রতিটি রেকর্ডের জন্য", আপনি বোঝাচ্ছেন যে আরও একটি "আইডি" কলাম রয়েছে যা আমরা "প্রথম" সারিটি চিহ্নিত করতে ব্যবহার করতে পারি।

SELECT id
    , field1
    , field2
    , field3
FROM
(
    SELECT id
        , field1
        , field2
        , field3
        , RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
    FROM table_name
) a
WHERE [rank] > 1

সবেমাত্র এসকিউএল সার্ভার 2008 ট্যাগটি লক্ষ্য করেছেন। আমার পরামর্শটি এখনও কার্যকর is
নিক ভ্যাকাকারো

1
দুর্দান্ত সমাধান কারণ এটি সারিগুলিও ফেরত দেয় যা প্রশ্নের মধ্যে থাকা সারণী থেকে মুছতে হবে
Realto619

1
এটি পিকে ক্ষেত্রের তালিকা হিসাবে
পার্টিশন

6

সদৃশ মানগুলি দেখতে:

with MYCTE  as (
    select row_number() over ( partition by name  order by name) rown, *
    from tmptest  
    ) 
select * from MYCTE where rown <=1

3

আপনি যদি এসকিউএল সার্ভার ২০০৫ বা তার পরে ব্যবহার করছেন (এবং আপনার প্রশ্নের জন্য ট্যাগগুলি এসকিউএল সার্ভার ২০০ indicate ইঙ্গিত করে) তবে কোনও কারণে যুক্ত হয়ে যদি যুক্ত হয় তবে কম ব্যবহারযোগ্য বা অযৌক্তিক হয়ে থাকলে আপনি প্রথমটির পরে সদৃশ রেকর্ডস ফিরিয়ে আনতে র‌্যাঙ্কিং ফাংশন ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি এটি কার্যকরভাবে দেখায়, যেখানে এটি পরীক্ষা করা কলামগুলিতে নাল মানগুলির সাথেও কাজ করে।

create table Table1 (
 Field1 int,
 Field2 int,
 Field3 int,
 Field4 int 
)

insert  Table1 
values    (1,1,1,1)
        , (1,1,1,2)
        , (1,1,1,3)
        , (2,2,2,1)
        , (3,3,3,1)
        , (3,3,3,2)
        , (null, null, 2, 1)
        , (null, null, 2, 3)

select    *
from     (select      Field1
                    , Field2
                    , Field3
                    , Field4
                    , row_number() over (partition by   Field1
                                                      , Field2
                                                      , Field3
                                         order by       Field4) as occurrence
          from      Table1) x
where     occurrence > 1

এই উদাহরণটি চালানোর পরে লক্ষ্য করুন যে প্রতি "গ্রুপ" এর মধ্যে প্রথম রেকর্ড বাদ দেওয়া হয়েছে এবং নাল মান সহ রেকর্ডগুলি সঠিকভাবে পরিচালনা করা হয়।

যদি কোনও গ্রুপের মধ্যে রেকর্ডগুলি অর্ডার করার জন্য আপনার কাছে কোনও কলাম উপলব্ধ না থাকে তবে আপনি বিভাগ-দ্বারা কলামগুলি ক্রমানুসারে কলামগুলি ক্রম হিসাবে ব্যবহার করতে পারেন।


1
CREATE TABLE #tmp
(
    sizeId Varchar(MAX)
)

INSERT  #tmp 
    VALUES ('44'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46')


SELECT * FROM #tmp
DECLARE @SqlStr VARCHAR(MAX)

SELECT @SqlStr = STUFF((SELECT ',' + sizeId
              FROM #tmp
              ORDER BY sizeId
              FOR XML PATH('')), 1, 1, '') 


SELECT TOP 1 * FROM (
select items, count(*)AS Occurrence
  FROM dbo.Split(@SqlStr,',')
  group by items
  having count(*) > 1
  )K
  ORDER BY K.Occurrence DESC    

0

প্রতিটি নির্বাচনের বিবৃতিগুলির সেপ্রেটলি গণনা করার জন্য এই ক্যোয়ারীটি চেষ্টা করুন:

select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
from table_name
group by field1,field2,field3
having count(*) > 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.