Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक समय श्रृंखला में विशेष मानदंडों को पूरा करने वाली लगातार वस्तुओं का पता लगाएं

इसके लिए मेरा दृष्टिकोण:टिप्पणियों की समय-श्रृंखला से शुरू करें, और प्रत्येक को एक क्रमांक दें।

यह सीरियल नंबरिंग 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

मज़ा, आह?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SPARQL क्वेरी एक नोड के सभी जनक प्राप्त करने के लिए

  2. डेटाबेस से मूल्यों के साथ डायनामिक मेल कॉन्फ़िगरेशन [लारवेल]

  3. MySQL समूह के लिए नवीनतम रिकॉर्ड पुनर्प्राप्त करता है

  4. हाइबरनेट में मूल SQL का उपयोग करके बैच सम्मिलित करें

  5. mysql COUNT(*) बनाम COUNT(DISTINCT col)