SQL Server أفضل طريقة لحساب datediff بين الصف الحالي والصف التالي؟

StackOverflow https://stackoverflow.com/questions/52430

  •  09-06-2019
  •  | 
  •  

سؤال

لقد حصلت على الهيكل الخام التالي:

Object -> Object Revisions -> Data

يمكن مشاركة البيانات بين عدة كائنات.

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

أستخدم حاليًا مؤشرًا وجدولًا مؤقتًا للاحتفاظ بالمعرفات والتاريخ بين التغييرات حتى أتمكن من تحديد الفاكهة المعلقة المنخفضة للتخلص منها.وهذا يعني استخدام @LastID، و@LastDate، والتحديثات والإدراجات في الجدول المؤقت، وما إلى ذلك...

هل هناك طريقة أسهل/أفضل لحساب فرق التاريخ بين الصف الحالي والصف التالي في مجموعة النتائج الأولية الخاصة بي دون استخدام المؤشر والجدول المؤقت؟

أنا أستخدم SQL Server 2000، ولكنني سأكون مهتمًا بأي ميزات جديدة لعامي 2005 و2008 يمكن أن تساعد في هذا أيضًا.

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

المحلول

إذا كان عمود الهوية متسلسلاً، فيمكنك استخدام هذا الأسلوب:

SELECT curr.*, DATEDIFF(MINUTE, prev.EventDateTime,curr.EventDateTime) Duration FROM DWLog curr join DWLog prev on prev.EventID = curr.EventID - 1

نصائح أخرى

هنا مثال SQL.إذا كان لديك عمود الهوية، فيمكنك استخدامه بدلاً من "تاريخ النشاط".

SELECT DATEDIFF(HOUR, prev.ActivityDate, curr.ActivityDate)
  FROM MyTable curr
  JOIN MyTable prev
    ON prev.ObjectID = curr.ObjectID
  WHERE prev.ActivityDate =
     (SELECT MAX(maxtbl.ActivityDate)
        FROM MyTable maxtbl
        WHERE maxtbl.ObjectID = curr.ObjectID
          AND maxtbl.ActivityDate < curr.ActivityDate)

يمكنني إزالة "السابق"، ولكن ضعه هناك على افتراض أنك بحاجة إلى معرفات منه للحذف.

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

إليك ما حصلت عليه حتى الآن، أردت أن أعطي هذا المزيد من الوقت قبل قبول الإجابة.

DECLARE @IDs TABLE 
(
  ID int , 
  DateBetween int
)

DECLARE @OID int
SET @OID = 6150

-- Grab the revisions, calc the datediff, and insert into temp table var.

INSERT @IDs
SELECT ID, 
       DATEDIFF(dd, 
                (SELECT MAX(ActiveDate) 
                 FROM ObjectRevisionHistory 
                 WHERE ObjectID=@OID AND 
                       ActiveDate < ORH.ActiveDate), ActiveDate) 
FROM ObjectRevisionHistory ORH 
WHERE ObjectID=@OID


-- Hard set DateBetween for special case revisions to always keep

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MIN(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MAX(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 
 WHERE ID=(SELECT ID 
           FROM ObjectRevisionHistory 
           WHERE ObjectID=@OID AND Active=1)


-- Select out IDs for however I need them

 SELECT * FROM @IDs
 SELECT * FROM @IDs WHERE DateBetween < 2
 SELECT * FROM @IDs WHERE DateBetween > 2

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top