سؤال
لديّ جدول انطلاق يحتوي على سلسلة من صفوف البيانات التي مأخوذة من ملف بيانات.
كل صف يشرح التغيير إلى صف في نظام بعيد ، فإن الصفوف هي لقطات فعالة للصف المصدر الذي تم أخذه بعد كل تغيير. يحتوي كل صف على طوابع زمنية بيانات 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