2010-06-21 19 views
32

मेरे पास एक टेबल (MySQL) है जो नमूने को हर एन सेकंड में कैप्चर करता है। तालिका में कई कॉलम हैं, लेकिन इसके लिए जो कुछ भी मायने रखता है वह दो है: टाइम स्टैम्प (टाइमस्टैम्प टाइप करें) और एक गिनती (प्रकार INT)।चयन/समूह द्वारा - समय के खंड (10 सेकंड, 30 सेकंड, आदि)

मैं क्या करना चाहता हूं, कई बार गिनती कॉलम की रकम और औसत प्राप्त करें। उदाहरण के लिए, मेरे पास रिकॉर्ड किए गए प्रत्येक 2 सेकंड के नमूने हैं, लेकिन मुझे सभी नमूने के लिए 10 सेकंड या 30 सेकंड विंडो में सभी नमूनों के लिए गिनती कॉलम का योग चाहिए।

 
+---------------------+-----------------+ 
| time_stamp   | count   | 
+---------------------+-----------------+ 
| 2010-06-15 23:35:28 |    1 | 
| 2010-06-15 23:35:30 |    1 | 
| 2010-06-15 23:35:30 |    1 | 
| 2010-06-15 23:35:30 |    942 | 
| 2010-06-15 23:35:30 |    180 | 
| 2010-06-15 23:35:30 |    4 | 
| 2010-06-15 23:35:30 |    52 | 
| 2010-06-15 23:35:30 |    12 | 
| 2010-06-15 23:35:30 |    1 | 
| 2010-06-15 23:35:30 |    1 | 
| 2010-06-15 23:35:33 |   1468 | 
| 2010-06-15 23:35:33 |    247 | 
| 2010-06-15 23:35:33 |    1 | 
| 2010-06-15 23:35:33 |    81 | 
| 2010-06-15 23:35:33 |    16 | 
| 2010-06-15 23:35:35 |   1828 | 
| 2010-06-15 23:35:35 |    214 | 
| 2010-06-15 23:35:35 |    75 | 
| 2010-06-15 23:35:35 |    8 | 
| 2010-06-15 23:35:37 |   1799 | 
| 2010-06-15 23:35:37 |    24 | 
| 2010-06-15 23:35:37 |    11 | 
| 2010-06-15 23:35:37 |    2 | 
| 2010-06-15 23:35:40 |    575 | 
| 2010-06-15 23:35:40 |    1 | 
| 2010-06-17 10:39:35 |    2 | 
| 2010-06-17 10:39:35 |    2 | 
| 2010-06-17 10:39:35 |    1 | 
| 2010-06-17 10:39:35 |    2 | 
| 2010-06-17 10:39:35 |    1 | 
| 2010-06-17 10:39:40 |    35 | 
| 2010-06-17 10:39:40 |    19 | 
| 2010-06-17 10:39:40 |    37 | 
| 2010-06-17 10:39:42 |    64 | 
| 2010-06-17 10:39:42 |    3 | 
| 2010-06-17 10:39:42 |    31 | 
| 2010-06-17 10:39:42 |    7 | 
| 2010-06-17 10:39:42 |    246 | 
+---------------------+-----------------+ 

उत्पादन मैं चाहते हैं (ऊपर डेटा के आधार पर) इस तरह दिखना चाहिए:

यहाँ डेटा का एक उदाहरण है

 
+---------------------+-----------------+ 
| 2010-06-15 23:35:00 |    1 | # This is the sum for the 00 - 30 seconds range 
| 2010-06-15 23:35:30 |   7544 | # This is the sum for the 30 - 60 seconds range 
| 2010-06-17 10:39:35 |    450 | # This is the sum for the 30 - 60 seconds range 
+---------------------+-----------------+ 

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

मैं इस तालिका से अन्य तालिका में डेटा को सिफॉन करने के लिए इस क्वेरी का उपयोग करने जा रहा हूं।

धन्यवाद!

उत्तर

58

GROUP BY UNIX_TIMESTAMP(time_stamp) DIV 30

या किसी कारण आप 20 सेकंड के अंतराल में उन्हें समूह चाहता था के लिए कहते हैं कि यह DIV 20 आदि GROUP BY मूल्यों के बीच की सीमाओं को बदलने के लिए होगा आप इस्तेमाल कर सकते हैं

GROUP BY (UNIX_TIMESTAMP(time_stamp) + r) DIV 30

जहां r 30 से कम एक शाब्दिक nonnegative पूर्णांक है। तो

GROUP BY (UNIX_TIMESTAMP(time_stamp) + 5) DIV 30

आपको एचएच: मिमी: 05 और एचएच: मिमी: 35 और एचएच: मिमी: 35: एचएच: मिमी + 1: 05 के बीच रकम देना चाहिए।

+0

बिल्कुल सही! यह * बिल्कुल * मुझे क्या चाहिए! बहुत बहुत धन्यवाद! –

6

मैंने अपनी परियोजना में हैमरेट के समाधान की कोशिश की, लेकिन यह अच्छी तरह से काम नहीं करता था जहां श्रृंखला से नमूने गायब थे। यहाँ है कि 27 मिनट समय अंतराल द्वारा metric_table और समूह परिणामों से टाइमस्टैम्प (टीएस), उपयोगकर्ता नाम और औसत उपाय चयन करने के लिए माना जाता है क्वेरी का एक उदाहरण है:

select 
    min(ts), 
    user_name, 
    sum(measure)/27 
from metric_table 
where 
    ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00' 

group by unix_timestamp(ts) div 1620, user_name 
order by ts, user_name 
; 

नोट: 27 मिनट (चुनिंदा में) = 1620 सेकंड (समूह में), 2160 मिनट = 3 दिन (वह समय सीमा है)

जब मैंने एक समय श्रृंखला के खिलाफ यह प्रश्न चलाया जहां नमूने अनियमित रूप से दर्ज किए गए थे (दूसरे शब्दों में: किसी भी समय के लिए टिकट नहीं था सभी उपयोगकर्ता नामों के लिए माप मानों को खोजने की गारंटी) परिणाम अंतराल के अनुसार मुद्रित नहीं थे (हर 27 मिनट में नहीं रखा गया था)। मुझे संदेह है कि कुछ समूहों में एक समय टिकट मुद्रित करने के लिए न्यूनतम (टीएस) की वजह से अपेक्षित मंजिल (ts0 + i * अंतराल) से अधिक था। मैंने पूर्व क्वेरी को इस पर संशोधित किया:

select 
    from_unixtime(unix_timestamp(ts) - unix_timestamp(ts) mod 1620) as ts1, 
    user_name, 
    sum(measure)/27 
from metric_table 
where 
    ts between date_sub('2015-03-17 00:00:00', INTERVAL 2160 MINUTE) and '2015-03-17 00:00:00' 

group by ts1, user_name 
order by ts1, user_name 
; 

और यह नमूने गायब होने पर भी ठीक काम करता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि एक बार गणित का चयन करने के लिए स्थानांतरित हो जाने पर यह गारंटी देता है कि ts1 समय चरणों के साथ संरेखित होगा।

+0

इसे लाने के लिए धन्यवाद, मुझे बहुत मदद की! – citysurrounded

+0

अद्भुत सामान! जब मुझे उस समय बाल्टी में कोई नमूने नहीं हैं, तो अब मुझे केवल "शून्य" पंक्ति रिकॉर्ड करने का एक तरीका है ... –

+0

@DanielRhodes कभी भी एक को समझते हैं? –

0

बहुत अजीब लेकिन यहाँ समाधान का उपयोग:

Average of data for every 5 minutes in the given times

हम जैसे कुछ सुझाव है कि कर सकते हैं: meteor-m2_msgi से डीटी, औसत (1das4hrz रूप

select convert(
(min(dt_record) div 50)*50 - 20*((convert(min(dt_record), datetime) div 50) mod 2), 

datetime)) जहां dt_record> = '2016-11-13 05:00:00' और dt_record < '2016-11-14 00:00:00' समूह द्वारा परिवर्तित (dt_record, डेटाटाइम) div 50; क्योंकि का 1/2 सामान्य मिनट 30 सेकंड है

select (
convert(
min(dt_record), datetime) div 50)*50 - 20*(
(convert(min(dt_record), datetime) div 50) mod 2 
) as dt, 
avg(column) from `your_table` 
where dt_record>='2016-11-13 05:00:00' 
and dt_record < '2016-11-14 00:00:00' 
group by convert(dt_record, datetime) div 50; 

50 है, जबकि 'पूर्णांक दिनांक स्वरूप' 50

2

एक अन्य समाधान से विभाजित करने के लिए हमें लगता है।

किसी भी अंतराल पर औसत करने के लिए आप अपने डीटी से टाइमस्टैम्प और समूह को अपने अंतराल (उदाहरण में 7 सेकंड) द्वारा मॉड्यूलो द्वारा परिवर्तित कर सकते हैं।

select FROM_UNIXTIME(
    UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7 
) as dt, avg(1das4hrz) from `meteor-m2_msgi` 
where dt_record>='2016-11-13 05:00:00' 
and dt_record < '2016-11-13 05:02:00' 
group by FROM_UNIXTIME(
    UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7); 

यह दिखाने के लिए कि यह कैसे काम करता है, मैं गणना दिखाता हूं, एक रिपोर्ट तैयार करता हूं।

select dt_record, minute(dt_record) as mm, SECOND(dt_record) as ss, 
UNIX_TIMESTAMP(dt_record) as uxt, UNIX_TIMESTAMP(dt_record) mod 7 as ux7, 
FROM_UNIXTIME(
    UNIX_TIMESTAMP(dt_record) - UNIX_TIMESTAMP(dt_record) mod 7) as dtsub, 
column from `yourtable` where dt_record>='2016-11-13 05:00:00' 
and dt_record < '2016-11-13 05:02:00'; 

+---------------------+--------------------+ 
| dt     | avg(column)  | 
+---------------------+--------------------+ 
| 2016-11-13 04:59:43 | 25434.85714285714 | 
| 2016-11-13 05:00:42 | 5700.728813559322 | 
| 2016-11-13 05:01:41 | 950.1016949152543 | 
| 2016-11-13 05:02:40 | 4671.220338983051 | 
| 2016-11-13 05:03:39 | 25468.728813559323 | 
| 2016-11-13 05:04:38 | 43883.52542372881 | 
| 2016-11-13 05:05:37 | 24589.338983050846 | 
+---------------------+--------------------+ 


+---------------------+-----+-----+------------+------+---------------------+----------+ 
| dt_record   | mm | ss | uxt  | ux7 | dtsub    | column | 
+---------------------+------+-----+------------+------+---------------------+----------+ 
| 2016-11-13 05:00:00 | 0 | 0 | 1479002400 | 1 | 2016-11-13 04:59:59 | 36137 | 
| 2016-11-13 05:00:01 | 0 | 1 | 1479002401 | 2 | 2016-11-13 04:59:59 | 36137 | 
| 2016-11-13 05:00:02 | 0 | 2 | 1479002402 | 3 | 2016-11-13 04:59:59 | 36137 | 
| 2016-11-13 05:00:03 | 0 | 3 | 1479002403 | 4 | 2016-11-13 04:59:59 | 34911 |  
| 2016-11-13 05:00:04 | 0 | 4 | 1479002404 | 5 | 2016-11-13 04:59:59 | 34911 | 
| 2016-11-13 05:00:05 | 0 | 5 | 1479002405 | 6 | 2016-11-13 04:59:59 | 34911 | 
| 2016-11-13 05:00:06 | 0 | 6 | 1479002406 | 0 | 2016-11-13 05:00:06 | 33726 | 
| 2016-11-13 05:00:07 | 0 | 7 | 1479002407 | 1 | 2016-11-13 05:00:06 | 32581 | 
| 2016-11-13 05:00:08 | 0 | 8 | 1479002408 | 2 | 2016-11-13 05:00:06 | 32581 | 
| 2016-11-13 05:00:09 | 0 | 9 | 1479002409 | 3 | 2016-11-13 05:00:06 | 31475 | 
+---------------------+-----+-----+------------+------+---------------------+----------+ 

क्या कोई कुछ तेज़ सुझाव दे सकता है?

संबंधित मुद्दे