इसके लिए मेरा दृष्टिकोण:टिप्पणियों की समय-श्रृंखला से शुरू करें, और प्रत्येक को एक क्रमांक दें।
यह सीरियल नंबरिंग MySQL में गर्दन में दर्द है, लेकिन कोई बात नहीं। टीएस कॉलम (एक डेटाटाइम आइटम) और एक अस्थायी कॉलम वाली तालिका को देखते हुए, उन्हें सीरियल नंबर के साथ प्राप्त करने के लिए यहां क्वेरी है।
SELECT @sample:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
ORDER BY ts
) C,
(SELECT @sample:=0) s
इस sqlfiddle पर एक नज़र डालें:http://sqlfiddle.com/#!2/ d81e2/5/0
ठीक है, यह बहुत मामूली बात है। अब, मान लें कि हम ऐसे समय की तलाश कर रहे हैं जहां तापमान 25 डिग्री या उससे अधिक हो। ऐसा करने के लिए हमें समय श्रृंखला को काटना होगा ताकि यह छोड़ जाए उन टिप्पणियों। यह इस प्रकार है:
SELECT @sample:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
WHERE NOT temp >= 25
ORDER BY ts
) C,
(SELECT @sample:=0) s
यहाँ sqlfiddle है:http://sqlfiddle.com/#!2/d81e2/6 /0
अब अगली तरकीब इस क्रम में समय अंतराल को खोजने की है। हम ऐसा करने के लिए इस SO पोस्ट से तकनीक का उपयोग कर सकते हैं। विधि MySQL में समय श्रृंखला डेटा में अंतराल खोजने के लिए?
अगला कदम, हम इसे खुद से जोड़ते हैं।
SELECT two.ser, two.ts, two.temp,
TIMESTAMPDIFF(MINUTE, two.ts, one.ts) gap
FROM (
/* virtual table */
) ONE
JOIN (
/* same virtual table */
) TWO ON (TWO.ser+ 1 = ONE.ser)
इस क्वेरी को श्रृंखला में प्रत्येक आइटम और उसके बाद वाले के बीच का समय अंतराल मिलता है। यह अवधारणात्मक रूप से करने के लिए एक सीधी बात है, लेकिन SQL के MySQL संस्करण में मुश्किल है। यहां पूरी क्वेरी है।
SELECT two.ser, two.ts, two.temp,
TIMESTAMPDIFF(MINUTE, two.ts, one.ts) gap
FROM (
SELECT @sample:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
WHERE NOT temp >= 25
ORDER BY ts
) C,
(SELECT @sample:=0) s
) ONE
JOIN (
SELECT @sample2:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
WHERE NOT temp >= 25
ORDER BY ts
) C,
(SELECT @sample2:=0) s
) TWO ON (TWO.ser+ 1 = ONE.ser)
यहाँ sqlfiddle है:http://sqlfiddle.com/#!2/d81e2/13 /0 ध्यान दें कि कुछ अंतराल 30 मिनट की अवधि के हैं। लगातार रीडिंग के लिए यह सामान्य है। कुछ 60 मिनट के हैं। यह भी सामान्य है, क्योंकि मैं जिस समय श्रृंखला का उपयोग कर रहा हूं उसमें कुछ गायब प्रविष्टियां हैं। इस परिणाम सेट में प्रविष्टियां अंतराल से ठीक पहले का समय और तापमान दिखाती हैं।
तो, जो कुछ बचा है वह है जंक गैप्स (30 और 60 मिनट) से छुटकारा पाना और फिर शेष गैप्स को अवरोही क्रम में क्रमित करना है।
SELECT two.ts, two.temp,
TIMESTAMPDIFF(MINUTE, two.ts, one.ts) gap
FROM (
SELECT @sample:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
WHERE NOT temp >= 25
ORDER BY ts
) C,
(SELECT @sample:=0) s
) ONE
JOIN (
SELECT @sample2:[email protected]+1 AS ser, ts, temp
FROM (
SELECT ts,temp
FROM t
WHERE NOT temp >= 25
ORDER BY ts
) C,
(SELECT @sample2:=0) s
) TWO ON (TWO.ser+ 1 = ONE.ser)
WHERE TIMESTAMPDIFF(MINUTE, two.ts, one.ts)> 60
ORDER BY TIMESTAMPDIFF(MINUTE, two.ts, one.ts) DESC
यह समय के प्रत्येक अनुक्रम के लिए एक पंक्ति देता है जहां तापमान 25 डिग्री से ऊपर होता है; पहले सबसे लंबा समय। परिणाम सेट में दिखाया गया आइटम ऊपर जाने से पहले पिछली बार 25 से नीचे का तापमान है। एसक्यूएल फिडल। http://sqlfiddle.com/#!2/d81e2/14/0ए>
मज़ा, आह?