2009-05-18 11 views
6

मेरे पास एक MySQL डेटाबेस है जो कुछ टाइमस्टैम्प स्टोर करता है। आइए मान लें कि टेबल में मौजूद सभी आईडी और टाइमस्टैम्प है। टाइमस्टैम्प को डुप्लिकेट किया जा सकता है।किसी तालिका में पंक्तियों के बीच औसत समय अंतर कैसे प्राप्त करें?

मैं लगातार पंक्तियों के बीच औसत समय अंतर ढूंढना चाहता हूं जो डुप्लिकेट नहीं हैं (इसी तरह)। एसक्यूएल में ऐसा करने का कोई तरीका है?

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol)) 
from table cur 
inner join table prev 
    on cur.id = prev.id + 1 
    and cur.datecol <> prev.datecol 

timestampdiff समारोह आप दिन, महीने, सेकंड के बीच चयन करने के लिए, और इतने पर अनुमति देता है:

उत्तर

29

अपनी मेज टी है, और अपने टाइमस्टैम्प स्तंभ ts है, और आप सेकंड में जवाब चाहते हैं:

SELECT TIMESTAMPDIFF(SECOND, MIN(ts), MAX(ts)) 
    /
     (COUNT(DISTINCT(ts)) -1) 
FROM t 

यह बड़ी टेबल के लिए मील तेज होगा क्योंकि इसमें कोई एन-स्क्वायर जॉइन

यह एक प्यारा गणितीय चाल का उपयोग करता है जो इस समस्या से मदद करता है। इस पल के लिए डुप्लीकेट की समस्या को अनदेखा करें। लगातार पंक्तियों के बीच औसत समय अंतर पहली टाइमस्टैम्प और अंतिम टाइमस्टैम्प के बीच का अंतर है, पंक्तियों की संख्या -1 से विभाजित है।

सबूत: लगातार पंक्तियों के बीच औसत दूरी लगातार पंक्तियों की संख्या से विभाजित, लगातार पंक्तियों के बीच की दूरी का योग है। लेकिन लगातार पंक्तियों के बीच का अंतर केवल पहली पंक्ति और आखिरी पंक्ति के बीच की दूरी है (माना जाता है कि वे टाइमस्टैम्प द्वारा क्रमबद्ध हैं)। और लगातार पंक्तियों की संख्या पंक्तियों की कुल संख्या -1 है।

तब हम बस टाइमस्टैम्प को अलग होने की स्थिति देते हैं।

+0

धन्यवाद, यह कमाल है। –

+0

शानदार। टाइमस्टैम्प के संभावित डुप्लिकेशन के आसपास होने का शानदार जवाब। – Bell

+0

अच्छी तरह से किया गया। सरल गणित हमेशा सबसे अच्छा विकल्प है। – Rob

1

यहाँ एक तरीका है।

आईडी के लगातार नहीं हैं, तो आप एक नियम में कोई अन्य पंक्तियों देखते हैं कि जोड़कर पिछली पंक्ति के बीच चयन कर सकते हैं:

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol)) 
from table cur 
inner join table prev 
    on prev.datecol < cur.datecol 
    and not exists (
     select * 
     from table inbetween 
     where prev.datecol < inbetween.datecol 
     and inbetween.datecol < cur.datecol) 
    ) 
2

आईडी सन्निहित हैं?

आप की तरह कुछ कर सकता है,

SELECT 
     a.ID 
     , b.ID 
     , a.Timestamp 
     , b.Timestamp 
     , b.timestamp - a.timestamp as Difference 
FROM 
    MyTable a 
    JOIN MyTable b 
      ON a.ID = b.ID + 1 AND a.Timestamp <> b.Timestamp 

है कि आप प्रत्येक लगातार पंक्ति जोड़ी पर समय मतभेद की एक सूची दे देंगे ...

तो फिर तुम कि लपेट सकता है एक औसत समूह में। ..

+0

तय। –

+0

ठीक है, लेकिन यह काम करेगा अगर आईएफएफ संगत हैं। असल में निक का जवाब मुझे लगता है कि एक बेहतर है। –

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