سؤال

لدي جدول يحتوي على ما يلي:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top