समय के अंतराल के आधार पर समूहीकरण रिकॉर्ड


13

मेरे पास निम्नलिखित स्कीमा के साथ एक तालिका है, और मुझे एक क्वेरी को परिभाषित करने की आवश्यकता है जो समय के अंतराल के आधार पर डेटा को समूह कर सकती है ( उदाहरण प्रति मिनट रिकॉर्ड ) और फिर पिछले समूह के बाद से स्नैपशॉट वॉले में परिवर्तन का योग प्रदान करें। वर्तमान में, SnapShotValue हमेशा वेतन वृद्धि करता है इसलिए मुझे केवल मतभेदों के योग की आवश्यकता है। क्या कोई SQL सर्वर T-SQL क्वेरी के साथ मदद कर सकता है जो ऐसा कर सकता है? मैं स्कीमा बदलने के लिए खुला हूं, लेकिन वर्तमान में मेरे पास यही है।

योजना

CaptureTime   (datetime)
SnapShotValue (int)

नमूना डेटा

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

वांछित क्वेरी परिणाम

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

जवाबों:


18
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

एसई डाटा

datediff(minute, 0, CaptureTime)आपको चंद मिनटों की संख्या देता है 1900-01-01T00:00:00

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)केवल एक मिनट के साथ डेटाइम के साथ समाप्त होने के बाद 1900-01-01T00:00:00से मिनट की संख्या को जोड़ता है 1900-01-01T00:00:00

1+वहाँ है, क्योंकि आप अगले मिनट चाहता था।

5 मिनट के अंतराल के साथ ऐसा करने के लिए आपको कुछ गणना करने की आवश्यकता है। मिनटों को विभाजित करें 5और साथ गुणा करें 5इससे आपको मिनटों को 5 मिनट की सटीकता के साथ गोल किया जा सकता है। यह कार्य करता है क्योंकि SQL सर्वर में पूर्णांक विभाजन का परिणाम पूर्णांक है।

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

इसने उत्तर के लिए एक अच्छा ढांचा प्रदान किया, लेकिन मुझे अभी भी यह समझने में थोड़ी परेशानी हो रही है कि यह कैसे काम करता है। जब मैंने 1 मिनट के अंतराल से ऑफसेट को 5 मिनट के अंतराल में बदलने की कोशिश की तो मुझे अभी भी 1 मिनट का अंतराल मिला है, जिसके पूरे परिणाम एक अलग शुरुआत बिंदु पर शुरू हो रहे हैं। यह बहुत संभावना है क्योंकि मैं गलत समझ रहा हूं कि यह कैसे काम करता है। क्या आप एक और नमूना दिखा सकते हैं जो एक अंतराल को दिखा रहा है तो 1 मिनट? धन्यवाद ...
जोइकी

0

मैं वहाँ 3 उदाहरण से थोड़ा भ्रमित हूँ, क्या यह 1325 माना जाता है? स्नैपशॉट के योग को कैप्चर करने की आवश्यकताओं के आधार पर, नीचे दी गई क्वेरी को वह प्राप्त करना चाहिए जो आप कर रहे हैं।

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

निम्नलिखित पोस्टग्रेक्यूएल में स्वीकृत उत्तर का अनुवाद है (मैंने 1 जनवरी 2000 को आधार तिथि के रूप में चुना था। इसे पहले की तारीख में बदलें यदि आपका डेटा इससे पुराना है):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.