سؤال

لديّ جدول انطلاق يحتوي على سلسلة من صفوف البيانات التي مأخوذة من ملف بيانات.

كل صف يشرح التغيير إلى صف في نظام بعيد ، فإن الصفوف هي لقطات فعالة للصف المصدر الذي تم أخذه بعد كل تغيير. يحتوي كل صف على طوابع زمنية بيانات META لإنشاء وتحديثات.

أحاول الآن إنشاء جدول تحديث من ملفات البيانات هذه التي تحتوي على جميع التحديث. أحتاج إلى طريقة لإزالة الصفوف ذات المفاتيح المكررة التي تحافظ على الصف فقط مع أحدث الطابع الزمني "تحديث".

أدرك أنه يمكنني استخدام تحويل "فرز" SSIS لإزالة التكرارات عن طريق الفرز على حقل المفاتيح وإخباره بإزالة التكرارات ، لكن كيف يمكنني التأكد من أن الصف الذي يحتفظ به هو واحد مع أحدث طابع زمني؟

هل كانت مفيدة؟

المحلول

سيؤدي ذلك إلى إزالة الصفوف بمطابقة على Col1 و Col2 وما إلى ذلك ولديها تحديث ليس الأحدث:

DELETE D
FROM   MyTable AS D
       JOIN MyTable AS T
           ON T.Col1 = D.Col1
          AND T.Col2 = D.Col2
          ...
          AND T.UpdateDate > D.UpdateDate

إذا كان من الضروري اعتبار Col1 و Col2 "مطابقة" إذا كان كلاهما فارغًا ، فستحتاج إلى استخدام:

       ON (T.Col1 = D.Col1 OR (T.Col1 IS NULL AND D.Col1 IS NULL))
      AND (T.Col2 = D.Col2 OR (T.Col2 IS NULL AND D.Col2 IS NULL))
      ...

يحرر: إذا كنت بحاجة إلى إجراء اختبار حساس للحالة فيقاعدة بيانات حساسة ثم على الأعمدة الفارار والنص استخدام:

       ON (T.Col1 = D.Col1  COLLATE Latin1_General_BIN 
           OR (T.Col1 IS NULL AND D.Col1 IS NULL))
       ...

نصائح أخرى

يمكنك استخدام Sort Transform في SSIS لفرز مجموعة البيانات الخاصة بك بواسطة أكثر من عمود واحد. ما عليك سوى الفرز حسب المفتاح الأساسي (أو حقل المعرف) يليه عمود الطابع الزمني بترتيب تنازلي.

راجع المقالة التالية لمزيد من التفاصيل حول العمل مع تحويل الفرز؟

http://msdn.microsoft.com/en-us/library/ms140182.aspx

منطقي؟

هتاف ، جون

هل من المنطقي تجاهل التكرارات عند الانتقال من التدريج إلى الجدول النهائي؟

عليك القيام بذلك على أي حال ، فلماذا لا تصدر استفسارًا واحد على طاولة التدريج بدلاً من اثنين؟

INSERT final
    (key, col1, col2)
SELECT
    key, col1, col2
FROM
    staging s
    JOIN
    (SELECT key, MAX(datetimestamp) maxdt FROM staging ms ON s.key = ms.key AND s.datetimestamp = ms.maxdt
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top