2010-03-01 10 views
41

के बीच की गणना समय अंतर मैं एक तालिका में निम्नलिखित शामिल है कि:दो पंक्तियाँ

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 सेकंड में एकत्रित करने के लिए सेट करता हूं, जब भी वैल्यू बदल जाता है। समय के संदर्भ में कोई डुप्लिकेट प्रविष्टियां नहीं हैं, न्यूनतम समय अंतर 1 सेकंड है।

जब मैं रीडिंग के बीच समय अंतराल नहीं जानता तो मामले के लिए पंक्तियों के बीच विलुप्त समय प्राप्त करने के लिए मैं एक प्रश्न कैसे स्थापित कर सकता हूं?

मैं एसक्यूएल सर्वर 2005.

उत्तर

116
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 

उपयोग कर रहा हूँ एसक्यूएल सर्वर 2012+ में:

SELECT DATEDIFF(second, pDataDate, dataDate) 
FROM (
     SELECT *, 
       LAG(dataDate) OVER (ORDER BY dataDate) pDataDate 
     FROM rows 
     ) q 
WHERE pDataDate IS NOT NULL 
+1

डैन जो उपयोगी है। मुझे एहसास नहीं हुआ कि मैं इसे इस तरह से कर सकता हूं, और अब मुझे कुछ प्रश्नों को बदलना होगा :) –

+0

मुझे इस तरह के समाधान, सरल और प्रभावी पसंद हैं। – ChandlerPelhams

+0

Awesomeoness, इच्छा है कि मेरे पास +10 बटन था। – vikingsteve

1

Quassnoi के प्रश्न पर एक छोटी सी ट्वीक यदि आप एक सबसिलेक्ट उपयोग करने के लिए किया जाएगा नहीं पसंद करते हैं:

SELECT 
     DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate) 
FROM rows 
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL 
संबंधित मुद्दे