تحديث SQL للتسجيل مع أقرب البيانات
-
06-07-2019 - |
سؤال
في خادم SQL 2008:
لنفترض أن لدي جدولين.
يحتوي الجدول 1 على 3 حقول:الاسم والتاريخ 1 والتاريخ 2.حاليًا، كافة إدخالات Date2 فارغة.(الاسم، التاريخ1) يشكل مفتاحًا فريدًا.
يحتوي الجدول 2 على حقلين:الاسم والتاريخ2.(الاسم، التاريخ2) يشكلان مفتاحًا فريدًا.
يحتوي كل "اسم" في الجدول 1 على إدخال واحد مطابق على الأقل في الجدول 2.
الآن، أريد تحديث كافة إدخالات Date2 في الجدول 1 (تذكر أنها كلها فارغة الآن) إلى إدخال Date2 في الجدول 2 الذي يمثل الأقرب حتى تاريخ 1 في الجدول 1.أي.التاريخ الذي سيعطي نتيجة:
min(datediff(dd,Table1.Date1,Table2.Date2))
لكي أكون واضحًا، إذا كان لدي الإدخالات التالية:
الجدول 1:
[اسم]:كارل، [التاريخ 1]:1/1/2009، [التاريخ الثاني]:باطل
الجدول 2:
[اسم]:كارل، [التاريخ 2]:1/1/2000
[اسم]:كارل، [التاريخ 2]:1/7/2009
[اسم]:كارل، [التاريخ 2]:1/1/2010
ثم أريد تحديث Table1.Date2 إلى "1/7/2009" نظرًا لأن هذا هو أقرب تاريخ إلى "1/1/2009".
شكرًا جزيلاً
كارل
المحلول
WITH abcd AS
(
SELECT t1.Name,t1.Date1, t2.Date2
,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
FROM
Table1 AS t1
JOIN Table2 AS t2 ON t1.Name = t2.Name
)
UPDATE Table1 SET
[Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)
نصائح أخرى
UPDATE Table1
SET Date2 = t2.Date2
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
)
تحقق مما إذا كنت بحاجة ABS
- أعتقد أنك تفعل.
كما أن الاستعلام لا يتعامل مع الحالة التي يوجد فيها تاريخان في الجدول 2 لهما نفس المسافة إلى التاريخ 1، ولكن من جوانب مختلفة.