MySQL

2011-09-10 4 views
6

में पंक्ति तिथियों के बीच अंतर का चयन करें, मैं एक ही तालिका में अलग-अलग पंक्तियों के बीच अद्वितीय दिनांक फ़ील्ड में अंतर की गणना करना चाहता हूं।MySQL

उदाहरण के लिए, निम्नलिखित डेटा दिया:

id | date 
    ---+------------ 
    1 | 2011-01-01 
    2 | 2011-01-02 
    3 | 2011-01-15 
    4 | 2011-01-20 
    5 | 2011-01-10 
    6 | 2011-01-30 
    7 | 2011-01-03 

मैं एक प्रश्न है जो निम्न पैदा करता है उत्पन्न करने के लिए करना चाहते हैं:

id | date  | days_since_last 
---+------------+----------------- 
1 | 2011-01-01 | 
2 | 2011-01-02 | 1 
7 | 2011-01-03 | 1 
5 | 2011-01-10 | 7 
3 | 2011-01-15 | 5 
4 | 2011-01-20 | 5 
6 | 2011-01-30 | 10 

कोई सुझाव क्या तारीख कार्यों के लिए मैं MySQL में प्रयोग करेंगे, या क्या कोई उप-चयन है जो ऐसा करेगा?

(बेशक, मैं पहली पंक्ति की अनदेखी करने के WHERE date > '2011-01-01' डाल बुरा नहीं।)

+0

यह वह जगह है जहां यह अच्छा है कि MySQL समर्थन एनालिटिक्स, लीड & अंतराल विशिष्ट होना होगा ... –

उत्तर

2

एक सहसंबद्ध सबक्वेरी मदद की हो सकता है:

SELECT 
    id, 
    date, 
    DATEDIFF(
    (SELECT MAX(date) FROM atable WHERE date < t.date), 
    date 
) AS days_since_last 
FROM atable AS t 
+0

यह काम करेगा, जो अच्छा है, लेकिन यह घोंसला के कारण बकवास जैसा प्रदर्शन करेगा सबक्वायरी (आप "एन" टेबल स्कैन करेंगे)। तिथि के अनुसार ऑर्डर करने के बाद पिछली पंक्ति के दिनांक मान को संग्रहीत करने के लिए एक चर का उपयोग करने का सबसे अच्छा तरीका होगा - और केवल एक पास करें। मुझे अभी परेशान नहीं किया जा सकता है, लेकिन यदि आप जाना चाहते हैं ... :) – Bohemian

+0

यही वह है जो मैंने सोचा था कि मैं देख रहा था, लेकिन बोहेमियन ने कहा, प्रदर्शन दर्द होता है। इसे पूरा करने में 28 मिनट लग गए (लगभग 26,000 पंक्तियों के साथ)। मैं इसे अपने प्रश्न का सबसे अच्छा जवाब के रूप में चुन रहा हूं, लेकिन सैनिटी के लिए अस्थायी तालिकाओं का उपयोग करना और क्रटेक के उत्तर का पालन करना सबसे अच्छा हो सकता है। –

+0

@ माइक एस .: मैं दो चीजों से हैरान हूं। सबसे पहले, मुझे हैरान है कि इस तरह की एक छोटी सी मेज पर यह इतना खराब प्रदर्शन किया। कृपया मुझे गलत मत समझो, मुझे काफी एहसास है कि यह समाधान सबसे तेज़ नहीं हो सकता है, यह औसत से भी कम हो सकता है, लेकिन 26,000 पंक्तियों पर 28 मिनट ... क्या यह हो सकता है कि तालिका में तिथि पर एक सूचकांक की कमी हो '? वैसे भी, एक और चीजें जो मुझे हैरान है कि आपने यह जवाब पहले स्थान पर चुना है। :) मेरा मतलब है कि मैं इसकी सराहना करता हूं, धन्यवाद, लेकिन मेरा विश्वास करो, अपने शब्दों के आधार पर, अब मैं खुद को क्रेट के जवाब को 'सही' समाधान के करीब पाता हूं, जो अंततः यह हो सकता है। –

0

कुछ इस तरह काम करना चाहिए:

SELECT mytable.id, mytable.date, DATEDIFF(mytable.date, t2.date) 
FROM mytable 
LEFT JOIN mytable AS t2 ON t2.id = table.id - 1 

बहरहाल, यह मतलब है कि आपके id में लगातार कर रहे हैं अपने टेबल, अन्यथा यह बिल्कुल काम नहीं करेगा। और शायद MySQL पहली पंक्ति के लिए शिकायत करेगा क्योंकि t2.datenull होगा लेकिन मेरे पास अब जांच करने का समय नहीं है।

+0

तुम मुझे जवाब देने के लिए हरा, तो मैं मैं बस अपना टुकड़ा जोड़ूंगा और सुझाव दूंगा कि वह प्रलेखन पर एक नज़र डालें: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff – Tchami

+0

@Krtek, धन्यवाद त्वरित प्रतिक्रिया के लिए। स्थिति को बेहतर ढंग से प्रतिबिंबित करने के लिए मुझे अपना प्रश्न अपडेट करना होगा, क्योंकि आईड्स कालक्रम क्रम में नहीं हैं। –

+0

@Tchami - आत्मविश्वास के आपके वोट के लिए धन्यवाद। ;) बाकी आश्वासन दिया, मुझे पता है कि दस्तावेज़ीकरण कहां है और अक्सर इसका परामर्श लें। –

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