2010-10-21 12 views
6

में मैं के रूप में किसी तालिका में सेंसर डाटा मिल गया है:असतत व्युत्पन्न एसक्यूएल

Time  Value 
10  100 
20  200 
36  330 
46  440 

मैं हर समयावधि के लिए मूल्यों में परिवर्तन को खींचने के लिए चाहते हैं। आदर्श रूप में, मैं प्राप्त करना चाहते हैं:

Starttime Endtime Change 
10  20  100 
20  36  130 
36  46  110 

मेरे एसक्यूएल कौशल, सुंदर अल्पविकसित हैं तो मेरे झुकाव एक स्क्रिप्ट है कि यह संसाधित करता है और फिर इसे नई तालिका को पीछे धकेलने के लिए बाहर सभी डेटा खींचने के लिए है, लेकिन मैंने सोचा कि मैं पूछूंगा कि डेटाबेस में यह सब करने का कोई आसान तरीका है या नहीं।

+0

एक उत्कृष्ट साक्षात्कार प्रश्न के लिए तैयार होगा: तैयार करने के लिए मामूली लेकिन ठीक करने के लिए गैर-तुच्छ। –

+0

इस तथ्य के लिए +1 कि आप इतने स्मार्ट हैं कि आप इसे पहले ही जानते हैं और प्रश्न पूछ रहे हैं। – Kuberchaun

उत्तर

1
Select a.Time as StartTime 
    , b.time as EndTime 
    , b.time-a.time as TimeChange 
    , b.value-a.value as ValueChange 
FROM YourTable a 
Left outer Join YourTable b ON b.time>a.time 
Left outer Join YourTable c ON c.time<b.time AND c.time > a.time 
Where c.time is null 
Order By a.time 
+0

यह मेरे लिए थोड़ा अक्षम लगता है। क्या इसमें शामिल होने पर 2 जुड़ने के लिए यह समझ में आता है? यह उत्तर देखें http://stackoverflow.com/questions/6299950/sql-difference-between-rows –

0

सबसे पहले, मैं तालिका में एक आईडी कॉलम जोड़ूंगा ताकि आपके पास कुछ ऐसा हो जो अनुमानतः पंक्ति से पंक्ति तक बढ़ता है।

फिर, मैं निम्न क्वेरी की कोशिश करेंगे:

SELECT t1.Time AS 'Starttime', t2.Time AS 'Endtime', 
    (t2.Value - t1.Value) AS 'Change' 
FROM SensorData t1 
INNER JOIN SensorData t2 ON (t2.id - 1) = t1.id 
ORDER BY t1.Time ASC 

मैं एक परीक्षण तालिका अपने आप के लिए यह प्रयास करने के लिए बनाने के लिए जा रहा हूँ तो मैं अगर यह अभी तक काम करता है पता नहीं है, लेकिन यह एक शॉट के लायक है!

अद्यतन एक मामूली समस्या के साथ फिक्स्ड (परिवर्तन एक संरक्षित शब्द है और उसे उद्धृत किया जाना था) लेकिन इसका परीक्षण किया गया और यह काम करता है! यह वास्तव में ऊपर परिभाषित परिणाम पैदा करता है।

+0

यह केवल तभी काम करेगा जब पंक्ति क्रम में (स्टार्टटाइम द्वारा) डाली जाती है, और कोई भी पंक्ति कभी नहीं हटाई जाएगी; एक पंक्ति को हटाने के परिणामस्वरूप एक अंतर होगा t2.id - t1.id होगा> 1 – Andy

+0

वास्तव में, आप सही हैं, लेकिन डेटा की प्रकृति (यानी एक सेंसर से आना) दिया गया है, मैं उम्मीद करता हूं कि पंक्तियां सही ढंग से होंगी अनुक्रमिक और एक हटाई गई पंक्ति की संभावना नहीं होगी (मुझे लगता है) क्योंकि यह डेटा में प्रभावी रूप से एक अंतर होगा। –

2
Select a.Time as StartTime, b.time as EndTime, b.time-a.time as TimeChange, b.value-a.value as ValueChange 
FROM YourTable a, YourTable b 
WHERE b.time = (Select MIN(c.time) FROM YourTable c WHERE c.time>a.time) 
+0

ने तालिका की मेरी प्रति पर इसका परीक्षण किया और यह भी काम करता है। मुझे समय परिवर्तन के साथ-साथ मूल्य परिवर्तन भी शामिल है :) –

+0

मेरा दूसरा उत्तर भी देखें, यह सबक्वायरी से बचाता है। – Andy

0

इस काम करता है?

WITH T AS 
(
SELECT [Time] 
    , Value 
    , RN1 = ROW_NUMBER() OVER (ORDER BY [Time]) 
    , RN2 = ROW_NUMBER() OVER (ORDER BY [Time]) - 1 
FROM SensorData 
) 
SELECT 
    StartTime = ISNULL(t1.[time], t2.[time]) 
, EndTime = ISNULL(t2.[time], 0) 
, Change = t2.value - t1.value 

FROM T t1 
    LEFT OUTER JOIN 
     T t2 

ON t1.RN1 = t2.RN2 
+0

SQL सर्वर के लिए काम करेगा, लेकिन अब मुझे एहसास है कि टैग नहीं किया गया है। –

संबंधित मुद्दे