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

SQL का उपयोग करके अनुपलब्ध डेटा पंक्तियों को कैसे खोजें?

select t1.ts as hival, t2.ts as loval
from metdata t1, metdata t2
where t2.ts = (select max(ts) from metdata t3
where t3.ts < t1.ts)
and not timediff(t1.ts, t2.ts) = '00:10:00'

यह क्वेरी दोहे लौटाएगी जिनका उपयोग आप लापता डेटा का चयन करने के लिए कर सकते हैं। लापता डेटा में क्वेरी द्वारा लौटाए गए प्रत्येक दोहे के लिए हाइवल और लवल के बीच टाइमस्टैम्प होगा।

संपादित करें - जांच के लिए thx, क्रेग

EDIT2 :

लापता टाइमस्टैम्प प्राप्त करना - यह एसक्यूएल पढ़ने में थोड़ा कठिन हो जाता है, इसलिए मैं इसे थोड़ा सा तोड़ दूंगा। सबसे पहले, हमें 10 मिनट के अंतराल में दिए गए निम्न मान और उच्च मान के बीच टाइमस्टैम्प मानों की एक श्रृंखला की गणना करने का एक तरीका चाहिए। जब आप टेबल नहीं बना सकते हैं तो ऐसा करने का एक तरीका निम्न sql पर आधारित है, जो परिणाम के रूप में 0 से 9 तक के सभी अंकों को बनाता है।

select d1.* from 
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d1

...अब इस तालिका को स्वयं की एक प्रति के साथ एक-दो बार संयोजित करने का अर्थ है कि हम गतिशील रूप से एक निर्दिष्ट लंबाई की सूची तैयार कर सकते हैं

select curdate() + 
INTERVAL  (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE 
as date 
from (select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d1
join
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d2
join
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d3
where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and 42
order by 1

... अब sql का यह टुकड़ा हमारी जरूरत के करीब हो रहा है। इसमें 2 इनपुट चर हैं:

  1. एक प्रारंभिक टाइमस्टैम्प (उदाहरण में मैंने दही () का उपयोग किया है); और एक
  2. पुनरावृति की संख्या - जहां क्लॉज उदाहरण में 42 पुनरावृत्तियों को निर्दिष्ट करता है, अधिकतम 3 x अंक तालिका के साथ 1000 अंतराल है

... जिसका अर्थ है कि हम प्रत्येक हाइवल लोवल जोड़ी के लिए टाइमस्टैम्प की एक श्रृंखला उत्पन्न करने के लिए ऊपर से उदाहरण चलाने के लिए मूल एसक्यूएल का उपयोग कर सकते हैं। मेरे साथ रहो, यह एसक्यूएल अब थोड़ा लंबा है...

select daterange.loval + INTERVAL  (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE as date 
from 
(select t1.ts as hival, t2.ts as loval
from metdata t1, metdata t2
where t2.ts = (select max(ts) from metdata t3
where t3.ts < t1.ts)
and not timediff(t1.ts, t2.ts) = '00:10:00'
) as daterange
join
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d1
join
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d2
join
(select 1 as digit
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 0 
) as d3
where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and
 round((time_to_sec(timediff(hival, loval))-600) /600)
order by 1

...अब थोड़ा महाकाव्य sql है
नोट:अंक तालिका का 3 बार उपयोग करने से अधिकतम अंतर मिलता है जो इसे 6 दिनों में थोड़ा सा कवर करेगा



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केकफ़्पी 3 में गतिशील रूप से डेटाबेस कनेक्शन बदलें

  2. mysql प्राकृतिक छँटाई

  3. किसी स्थिति में दो फ़ील्ड/कॉलम की तुलना कैसे करें?

  4. PHP और MySQL - स्रोत कोड में पासवर्ड से कैसे बचें?

  5. MySQL कहाँ और कहाँ से जुड़ें का चयन करें