احسب فرق الوقت بين صفين
-
23-09-2019 - |
سؤال
لدي جدول يحتوي على ما يلي:
DataDate Value
2010-03-01 08:31:32.000 100
2010-03-01 08:31:40.000 110
2010-03-01 08:31:42.000 95
2010-03-01 08:31:45.000 101
. .
. .
. .
أحتاج إلى مضاعفة عمود القيمة بسبب الفرق في الوقت بين الصفوف الحالية والسابقة ومجموع ذلك طوال اليوم.
لدي حاليا إعداد البيانات ليأتي في كل 10 ثوان مما يجعل تحويل بسيط في الاستعلام:
SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate
حيث يعد STARTDATE و ENDDATE تاريخ اليوم على 00:00:00 و 11:59:59.
قبل تعيين البيانات المراد جمعها كل 10 ثوانٍ ، تم جمعها كلما تغيرت القيمة. لا توجد أي إدخالات مكررة من حيث الوقت ، فاختلط الوقت الدنيا هو ثانية واحدة.
كيف يمكنني إعداد استعلام للحصول على الوقت المنقضي بين الصفوف للحالة عندما لا أعرف الفاصل الزمني بين القراءات؟
أنا أستخدم SQL Server 2005.
المحلول
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn
FROM mytable
)
SELECT DATEDIFF(second, mc.DataDate, mp.DataDate)
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
في SQL Server 2012+:
SELECT DATEDIFF(second, pDataDate, dataDate)
FROM (
SELECT *,
LAG(dataDate) OVER (ORDER BY dataDate) pDataDate
FROM rows
) q
WHERE pDataDate IS NOT NULL
نصائح أخرى
هناك القليل من التعديل على استعلام Quassnoi إذا كنت تفضل عدم استخدام مجموعة فرعية:
SELECT
DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL
لا تنتمي إلى StackOverflow