2012-03-22 12 views
9

मैं समूह के लिए कोशिश कर रहा हूँ में समूह दिनांक समय 5, 15, 30 और 60 मिनट के अंतराल में कुछ रिकॉर्ड:5,15,30 और 60 मिनट के अंतराल

SELECT AVG(value) as "AvgValue", 
sample_date/(5*60) as "TimeFive" 
FROM DATA 
WHERE id = 123 AND sample_date >= 3/21/2012 

मैं कई प्रश्नों चलाना चाहते हैं , प्रत्येक मेरे औसत मूल्यों को वांछित समय वृद्धि में समूहित करेगा। तो 5 मिनट क्वेरी इस तरह परिणाम वापस होगा:

AvgValue TimeFive 
6.90  1995-01-01 00:05:00 
7.15  1995-01-01 00:10:00 
8.25  1995-01-01 00:15:00 

30-मिनट क्वेरी इस परिणाम होगा:

AvgValue TimeThirty 
6.95  1995-01-01 00:30:00 
7.40  1995-01-01 01:00:00 

datetime स्तंभ yyyy-mm-dd hh:mm:ss प्रारूप

मैं हो रही है मेरे datetime कॉलम की अंतर्निहित रूपांतरण त्रुटियां। किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

+0

यह मेरे लिए स्पष्ट नहीं है कि 'अलग-अलग अंतराल में समूह' से आपका क्या मतलब है। याद करते हुए कि परिणाम कॉलम में जरूरी पंक्तियां हैं, क्या आप दिखा सकते हैं कि आपके डेटा की नमूना पंक्तियां कैसी दिखाई देगी? विशेष रूप से यह मुझे स्पष्ट नहीं है, क्या एक आईडी 1 5 मिनट के समूह में होगी, एक 15 मिनट के समूह में भी, एक 30 मिनट के समूह में ... आदि। यदि प्रत्येक रिकॉर्ड 4 समूहों में होगा, उदाहरण के लिए, परिणाम में इच्छित कॉलम के नाम क्या हैं? –

+2

इसके अलावा, यदि आप कई एसक्यूएल प्रश्न पोस्ट करने जा रहे हैं, तो 1) हमेशा विशिष्ट प्रकार के सर्वर के साथ प्रश्न टैग करें (मैं इसे एमएस एसक्यूएल के शीर्षक से देखता हूं, लेकिन यदि आपने टैग का उपयोग किया है तो वे आपको सुझाव देंगे कि आप एक संस्करण निर्दिष्ट कर सकते हैं) और 2) आप एक एसक्यूएल फिडल (http://sqlfiddle.org) स्थापित करने के लिए समय निकालकर "प्रश्न का क्या अर्थ है" को समझने की लागत को कम कर सकते हैं; यह आपको उन उदाहरण डेटा में डाल देता है जिन्हें आप क्वेरी करना चाहते हैं। –

+1

बस कुछ साफ़ करने के लिए: SQL सर्वर में 'DATETIME' ** स्ट्रिंग-आधारित प्रारूप में संग्रहीत ** कभी ** नहीं है - इसे आंतरिक रूप से दो 4-बाइट INT मानों के रूप में संग्रहीत किया जाता है। वह प्रारूप आपकी ** डिफ़ॉल्ट प्रस्तुति ** हो सकता है - लेकिन यह ** प्रारूप ** उस प्रारूप में संग्रहीत नहीं है! –

उत्तर

15

datediff(minute, '1990-01-01T00:00:00', yourDatetime) 

का प्रयोग के बाद से 1990/01/01 (आप इच्छित आधार तिथि का उपयोग कर सकते हैं) आप मिनट की संख्या दे देंगे।

फिर आप इस विभाजन के परिणामस्वरूप 5, 15, 30 या 60, और समूह द्वारा विभाजित कर सकते हैं। मैंने चेक किया है कि इसे एक पूर्णांक विभाजन के रूप में मूल्यांकन किया जाएगा, इसलिए आपको एक पूर्णांक संख्या मिलेगी जिसका उपयोग आप समूह के लिए कर सकते हैं।

यानी

group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5 

अद्यतन मूल प्रश्न डेटा की आवश्यकता के लिए संपादित किया गया था समूह के बाद तिथि समय प्रारूप में दिखाये जाने के रूप में, मैं इस सरल प्रश्न है कि क्या ओ पी करना होगा जोड़ दिया है चाहता है:

-- This convert the period to date-time format 
SELECT 
    -- note the 5, the "minute", and the starting point to convert the 
    -- period back to original time 
    DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period, 
    AP.AvgValue 
FROM 
    -- this groups by the period and gets the average 
    (SELECT 
     P.FiveMinutesPeriod, 
     AVG(P.Value) AS AvgValue 
    FROM 
     -- This calculates the period (five minutes in this instance) 
     (SELECT 
      -- note the division by 5 and the "minute" to build the 5 minute periods 
      -- the '2010-01-01T00:00:00' is the starting point for the periods 
      datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod, 
      T.Value 
     FROM Test T) AS P 
    GROUP BY P.FiveMinutesPeriod) AP 

नोट: मैं स्पष्टता के लिए 3 सबक्वेरी में इस विभाजित किया है। आपको इसे अंदर से पढ़ना चाहिए। यह, ज़ाहिर है, एक एकल, कॉम्पैक्ट क्वेरी के रूप में लिखा जा सकता है

नोट: अगर आप अवधि और प्रारंभ दिनांक समय आप किसी भी अंतराल आप की जरूरत है, किसी दिन से शुरू सप्ताह की तरह प्राप्त कर सकते हैं बदलने के लिए, या जो कुछ भी आप

की जरूरत कर सकते हैं आप के लिए इस क्वेरी इस का उपयोग परीक्षण डाटा जनरेट करना चाहते हैं:

Period      AvgValue 
2012-03-22 00:00:00.000 10 
2012-03-22 00:05:00.000 20 
2012-03-22 00:10:00.000 30 
:

CREATE TABLE Test 
(Id INT IDENTITY PRIMARY KEY, 
Time DATETIME, 
Value FLOAT) 

INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30) 
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30) 

क्वेरी को क्रियान्वित करने का नतीजा यह है

+1

मैं 1 99 0-1-1' की बजाय '19900101' का सुझाव दूंगा, क्योंकि समय के बिना तारीख निर्दिष्ट करने के लिए धराशायी प्रारूप संदिग्ध है। (बेशक, यह इस विशिष्ट उदाहरण में ठीक है, लेकिन यदि महीना और दिन अलग है, तो SQL सर्वर इसे दो तरीकों से समझ सकता है, या रूपांतरण त्रुटि बढ़ा सकता है) –

+0

सलाह के लिए धन्यवाद। मैंने यह प्रश्न चलाया और यह परिणाम में पंक्तियों में मेरे औसत मूल्यों को समूहित करना प्रतीत होता था, लेकिन मैं क्वेरी परिणामों में प्रकट होने के लिए कुल समय मान प्राप्त नहीं कर पा रहा हूं। मैंने क्वेरी पोस्ट – jrubengb

+0

में उपस्थित होने के लिए समय कॉलम प्राप्त करने के अपने प्रयास का वर्णन करने के लिए अपनी पोस्ट संपादित की है। मैंने '19900101' प्रारूप का उपयोग करने की कोशिश की है जिसे Damien_The_Unbeliever वर्णित किया गया है, और यह काम करने लगता है, हालांकि मुझे प्रारंभ में कोई अंतर नहीं दिखाई देता प्रश्न परिणाम सलाह के लिये धन्यवाद। – jrubengb

4

तो, ऐसे में आप इस googled, लेकिन आप mysql, जो मेरे मामले था में यह सब करने की ज़रूरत:

MySQL में आप @ JotaBe के जवाब पर

GROUP BY 
CONCAT(
    DATE_FORMAT(`timestamp`,'%m-%d-%Y %H:'), 
    FLOOR(DATE_FORMAT(`timestamp`,'%i')/5)*5 
) 
+1

... लेकिन सवाल एसक्यूएल सर्वर के बारे में है मेरे एसक्यूएल नहीं ?! – Tanner

+4

प्रश्न 'एसक्यूएल-सर्वर' के बारे में है, लेकिन इसे सादे 'एसक्यूएल' के साथ भी टैग किया गया है, जिसमें सभी स्वाद शामिल होंगे – chiliNUT

3

भवन कर सकते हैं (जो करने के लिए मैं पर टिप्पणी नहीं कर सकता - अन्यथा मैं चाहता हूं), आप इस तरह कुछ भी कोशिश कर सकते हैं जिसके लिए एक सबक्वायरी की आवश्यकता नहीं होगी।

SELECT 
    AVG(value) AS 'AvgValue', 

    -- Add the rounded seconds back onto epoch to get rounded time 
    DATEADD(
     MINUTE, 
     (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date)/30) * 30, 
     '1990-01-01T00:00:00' 
    )  AS 'TimeThirty' 

FROM YourTable 
-- WHERE your_date > some max lookback period 
GROUP BY 
    (DATEDIFF(MINUTE, '1990-01-01T00:00:00', your_date)/30) 

यह परिवर्तन अस्थायी टेबल और सबक्वेरी निकाल देता है।यह 30 मिनट अंतराल से समूहबद्ध करने के लिए एक ही कोर तर्क का उपयोग करता है, लेकिन परिणाम के हिस्से के रूप में डेटा को प्रस्तुत करते समय मैं गोलाकार दिनांक & समय प्राप्त करने के लिए अंतराल गणना को उलट रहा हूं।

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