it-swarm.dev

حدد عبارة للعثور على التكرارات في حقول معينة

هل يمكنك مساعدتي في عبارات SQL للعثور على التكرارات في حقول متعددة؟

على سبيل المثال ، في الكود الزائف:

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

ومن البيان أعلاه إذا كان هناك عدة حالات أرغب في تحديد كل سجل باستثناء السجل الأول .

406
JOE SKEET

للحصول على قائمة الحقول التي توجد بها سجلات متعددة ، يمكنك استخدام ..

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

تحقق من هذا الرابط لمزيد من المعلومات حول كيفية حذف الصفوف.

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

تحرير: كما ذكر المستخدمون الآخرون ، يجب أن يكون هناك معيار لتحديد كيفية تحديد "الصفوف الأولى" قبل استخدام النهج في الرابط أعلاه. بناءً على ذلك ، ستحتاج إلى استخدام ترتيب حسب الجملة واستعلام فرعي إذا لزم الأمر. إذا كان بإمكانك نشر بعض نماذج البيانات ، فستكون مفيدة حقًا.

826
Rajesh Chamarthi

لقد ذكرت "الأول" ، لذلك افترض أن لديك نوعًا من الطلب على بياناتك. دعنا نفترض أن بياناتك مرتبة حسب حقل ID.

يجب أن تحصل هذه SQL على الإدخالات المكررة باستثناء الأولى. يقوم بشكل أساسي بتحديد جميع الصفوف التي يوجد بها صف آخر به (أ) نفس الحقول و (ب) يوجد معرف أقل. لن يكون الأداء رائعًا ، لكنه قد يحل مشكلتك.

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)
42
Heinzi

هذا حل ممتع مع SQL Server 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
17
Nick Vaccaro

لرؤية القيم المكررة:

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

إذا كنت تستخدم SQL Server 2005 أو إصدار أحدث (وتشير علامات سؤالك إلى SQL Server 2008) ، فيمكنك استخدام وظائف الترتيب لإرجاع السجلات المكررة بعد السجل الأول إذا كان استخدام الصلات أقل رغبة أو غير عملي لسبب ما. يوضح المثال التالي هذا الإجراء ، حيث يعمل أيضًا مع القيم الخالية في الأعمدة التي تم فحصها.

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

لاحظ بعد تشغيل هذا المثال أنه يتم استبعاد السجل الأول من كل "مجموعة" ، وأنه يتم التعامل مع السجلات ذات القيم الخالية بشكل صحيح.

إذا لم يكن لديك عمود متاح لطلب السجلات داخل مجموعة ، فيمكنك استخدام أعمدة التقسيم كأعمدة ترتيب حسب.

3
Bradford Hoagland
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    
1
Mr.X

جرب هذا الاستعلام للحصول على عدد منفصل لكل عبارات SELECT:

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
0
daryosh setorg