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

MySQL में समय श्रृंखला डेटा में अंतराल खोजने की विधि?

आरंभ करने के लिए, आइए हम आपकी तालिका में प्रति घंटा प्रविष्टियों की संख्या को संक्षेप में प्रस्तुत करें।

SELECT CAST(DATE_FORMAT(entry_time,'%Y-%m-%d %k:00:00') AS DATETIME) hour,
       COUNT(*) samplecount
  FROM table
 GROUP BY CAST(DATE_FORMAT(entry_time,'%Y-%m-%d %k:00:00') AS DATETIME)

अब, यदि आप हर छह मिनट (एक घंटे में दस बार) कुछ लॉग करते हैं, तो आपके सभी नमूना गणना मान दस होने चाहिए। यह व्यंजक:CAST(DATE_FORMAT(entry_time,'%Y-%m-%d %k:00:00') AS DATETIME) बालों वाला दिखता है लेकिन यह आपके टाइमस्टैम्प को उस घंटे तक छोटा कर देता है जिसमें वे मिनट और सेकंड को शून्य कर देते हैं।

यह यथोचित रूप से कुशल है, और आपको आरंभ कर देगा। यदि आप अपने entry_time कॉलम पर एक इंडेक्स डाल सकते हैं और अपनी क्वेरी को कल के नमूने तक सीमित कर सकते हैं, तो यह बहुत कुशल है।

SELECT CAST(DATE_FORMAT(entry_time,'%Y-%m-%d %k:00:00') AS DATETIME) hour,
       COUNT(*) samplecount
  FROM table
 WHERE entry_time >= CURRENT_DATE - INTERVAL 1 DAY
   AND entry_time < CURRENT_DATE
 GROUP BY CAST(DATE_FORMAT(entry_time,'%Y-%m-%d %k:00:00') AS DATETIME)

लेकिन लापता नमूनों के साथ पूरे घंटे का पता लगाने में यह बहुत अच्छा नहीं है। यह आपके नमूने में घबराहट के प्रति भी थोड़ा संवेदनशील है। यानी, यदि आपका टॉप-ऑफ-द-घंटे नमूना कभी-कभी आधा सेकंड जल्दी (10:59:30) और कभी-कभी आधा सेकंड देर से (11:00:30) होता है, तो आपकी प्रति घंटा सारांश गणना बंद हो जाएगी। तो, यह घंटे सारांश बात (या दिन सारांश, या मिनट सारांश, आदि) बुलेटप्रूफ नहीं है।

सामान को पूरी तरह से ठीक करने के लिए आपको एक सेल्फ-जॉइन क्वेरी की आवश्यकता है; यह हेयरबॉल का थोड़ा अधिक है और लगभग उतना कुशल नहीं है।

आइए क्रमांकित नमूनों के साथ स्वयं को इस तरह एक वर्चुअल टेबल (सबक्वायरी) बनाकर शुरू करें। (यह MySQL में एक दर्द है; कुछ अन्य महंगे DBMS इसे आसान बनाते हैं। कोई बात नहीं।)

  SELECT @sample:[email protected]+1 AS entry_num, c.entry_time, c.value
    FROM (
        SELECT entry_time, value
      FROM table
         ORDER BY entry_time
    ) C,
    (SELECT @sample:=0) s

यह छोटी आभासी तालिका entry_num, entry_time, मान देती है।

अगला कदम, हम इसे खुद से जोड़ते हैं।

SELECT one.entry_num, one.entry_time, one.value, 
       TIMEDIFF(two.value, one.value) interval
  FROM (
     /* virtual table */
  ) ONE
  JOIN (
     /* same virtual table */
  ) TWO ON (TWO.entry_num - 1 = ONE.entry_num)

यह जॉइन के ON क्लॉज द्वारा शासित एक एकल प्रविष्टि द्वारा एक-दूसरे को ऑफसेट करने वाली अगली दो तालिकाओं को पंक्तिबद्ध करता है।

अंत में हम इस तालिका से interval . के साथ मान चुनते हैं आपकी दहलीज से बड़ा है, और नमूने के समय लापता लोगों के ठीक पहले हैं।

ओवरऑल सेल्फ जॉइन क्वेरी यह है। मैंने तुमसे कहा था कि यह एक हेयरबॉल था।

SELECT one.entry_num, one.entry_time, one.value, 
       TIMEDIFF(two.value, one.value) interval
  FROM (
    SELECT @sample:[email protected]+1 AS entry_num, c.entry_time, c.value
      FROM (
          SELECT entry_time, value
            FROM table
           ORDER BY entry_time
      ) C,
      (SELECT @sample:=0) s
  ) ONE
  JOIN (
    SELECT @sample2:[email protected]+1 AS entry_num, c.entry_time, c.value
      FROM (
          SELECT entry_time, value
            FROM table
           ORDER BY entry_time
      ) C,
      (SELECT @sample2:=0) s
  ) TWO ON (TWO.entry_num - 1 = ONE.entry_num)

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

  SELECT @sample:[email protected]+1 AS entry_num, c.entry_time, c.value
    FROM (
        SELECT entry_time, value
      FROM table
         ORDER BY entry_time
         WHERE entry_time >= CURRENT_DATE - INTERVAL 2 DAY
           AND entry_time < CURRENT_DATE /*yesterday but not today*/
    ) C,
    (SELECT @sample:=0) s


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस में बीक्रिप्ट हैशेड पासवर्ड को स्टोर करने के लिए मुझे किस कॉलम प्रकार/लंबाई का उपयोग करना चाहिए?

  2. MySQL में की-वैल्यू पेयर टेबल से डेटा के साथ एक पंक्ति प्राप्त करना

  3. MySql त्रुटि 150 - विदेशी कुंजियाँ

  4. डेटाबेस सेटअप करें और AWS Redshift और Mysql में केवल-पढ़ने के लिए उपयोगकर्ता बनाएं

  5. टाइमस्टैम्प को फ़ॉर्मेट करना