2013-09-22 13 views
7

हमारे पास एक MySQL डेटाबेस है जहां हमने समय श्रृंखला मान जोड़े हैं।MySQL में टाइम सीरीज डेटा: नमूना

------------------------------------- 
|Col A | Col B | Timestamp   | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:45:27 | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:46:27 | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:47:27 | 
------------------------------------- 

डेटा असमान w.r.t समय से स्थान दिया गया है, कुछ बातों के लिए कुछ सेकंड से एक मिनट & कुछ लोगों द्वारा अलग होती है।

क्या कोई कुशल तरीका है कि मैं इस डेटाबेस को प्रत्येक n वें मिनट/सेकंड/घंटे के लिए डेटा खींचने के लिए क्वेरी कर सकता हूं? आदर्श रूप में मैं n वें मिनट में (रैखिक) इंटरपोलेटेड मान चाहता हूं, लेकिन n वें मिनट के निकटतम बिंदु या n वें बिंदु से पहले या अंतिम बिंदु पर भी अंतिम बिंदु होगा।

उपयोग का मामला मैं इसे ग्राफ में प्लॉट करना चाहता हूं, लेकिन आवश्यक से बहुत अधिक अंक नहीं चाहता हूं। तो एक साल के लिए साजिश के लिए, मैं दिन में केवल दो अंक पूछना पसंद करूंगा। एक दिन के लिए साजिश करते समय, मैं हर मिनट या तो एक बिंदु प्लॉट करना चाहता हूं।

मैं यह सब PHP में कर सकता हूं, लेकिन क्या इसे सीधे डेटाबेस में करने का कोई तरीका है? यदि नहीं, तो मैं समय श्रृंखला डेटाबेस के उपयोग पर विचार कर रहा हूं, लेकिन बजट की बाधाएं मुझे केवल मुक्त लोगों तक सीमित करती हैं। क्या कोई खाली समय श्रृंखला डेटाबेस है जो बॉक्स नमूनाकरण और अधिमानतः इंटरपोलेशन से बाहर देता है?

+0

के संभावित डुप्लिकेट [ नमूनाकरण एसक्यूएल टाइम्सरीज] (http://stackoverflow.com/questions/7335627/sampling-sql- टाइम्सरीज) – Domi

उत्तर

0

मुझे इस पर एक झटका लगा है, मैं वास्तव में यह देखने में रूचि रखता हूं कि अन्य इसे कैसे हल करेंगे।

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

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

मैंने सोचा, एक समय सूचकांक तालिका बनाने था, यह इस तरह दिखता है ....

mysql> select * from ctb_time_idx WHERE YEAR(ctb_datetime) = 2013 LIMIT 10 ; 
+---------------------+ 
| ctb_datetime  | 
+---------------------+ 
| 2013-01-01 00:00:00 | 
| 2013-01-01 00:15:00 | 
| 2013-01-01 00:30:00 | 
| 2013-01-01 00:45:00 | 
| 2013-01-01 01:00:00 | 
| 2013-01-01 01:15:00 | 
| 2013-01-01 01:30:00 | 
| 2013-01-01 01:45:00 | 
| 2013-01-01 02:00:00 | 
| 2013-01-01 02:15:00 | 
+---------------------+ 
10 rows in set (0.07 sec) 

मैं तो संघ

(select 
    ctb_datetime AS time1 , 
    'Placeholder' AS TimeInterval , 
    NULL AS `Col A` , 
    NULL AS `Col B` 
from my_time_idx 
    where YEAR (ctb_time_idx.ctb_datetime ) = 2013) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:00') AS time1 , 
    '00min' AS TimeInterval , `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 00 AND 14 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:15') AS time1 , 
    '15min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 15 AND 29 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:30') AS time1 , 
    '30min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 30 AND 44 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:45') AS time1 , 
    '45min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 45 AND 59 )  
order by time1 

में मेरे डेटा मैं इस पर परीक्षण किया मेरी पुरानी टेबल और यह ठीक काम करने लगती है, मुझे अपने उदाहरण के अनुरूप अपना कोड दोबारा संपादित करना पड़ा, इसलिए उम्मीद है कि मैंने ऐसा करने पर इसे पेंच नहीं किया था।

+0

मुझे लगता है कि यह बहुत धीमा होगा, जब तक कि आप अपने टाइमस्टैम्प कॉलम पर पूर्ण टेक्स्ट इंडेक्स नहीं जोड़ते – Domi

-1
select unix_timestamp(now()); 
select from_unixtime(unix_timestamp(now())); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%300); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%900); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%1800); 

+-----------------------+ 
| unix_timestamp(now()) | 
+-----------------------+ 
|   1383077951 | 
+-----------------------+ 
1 row in set (0.00 sec) 

+--------------------------------------+ 
| from_unixtime(unix_timestamp(now())) | 
+--------------------------------------+ 
| 2013-10-29 20:19:11     | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

+----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%300) | 
+----------------------------------------------------------------+ 
| 2013-10-29 20:15:00           | 
+----------------------------------------------------------------+ 
1 row in set (0.00 sec) 

+----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%900) | 
+----------------------------------------------------------------+ 
| 2013-10-29 20:15:00           | 
+----------------------------------------------------------------+ 
1 row in set (0.00 sec) 

+-----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%1800) | 
+-----------------------------------------------------------------+ 
| 2013-10-29 20:00:00            | 
+-----------------------------------------------------------------+ 
1 row in set (0.00 sec) 
+1

SO में आपका स्वागत है। कोड के अलावा कृपया अपने उत्तर में एक स्पष्टीकरण जोड़ें पर विचार करें। ओपी को बताएं कि यह किस तरह उपयोगी है, वह क्या खो रहा है, या जो कुछ भी लोगों को यह समझने में मदद करता है कि यह एक उपयोगी/सहायक उत्तर क्यों है। देखें [मैं एक अच्छा जवाब कैसे लिखूं?] (Http://stackoverflow.com/help/how-to-answer) – dic19

0

मैं इसे अपने आप का उपयोग नहीं किया है, लेकिन हाल ही में InfluxDB है कि यह की तरह लगता है अपने मानदंडों को पूरा कर सकता है भर में आया था - एक खुला स्रोत समय श्रृंखला डेटाबेस aggregation queries में बनाया के साथ - उदाहरण के

SELECT MEAN(column_name) FROM series_name group by time(10m) 
संबंधित मुद्दे