MySQL क्वेरी ग्रुप दिन / महीने / वर्ष तक


649

क्या यह निर्धारित करना संभव है कि एक वर्ष, महीने, या दिन की निर्धारित अवधि में मेरे पास कितने रिकॉर्ड हैं TIMESTAMP, जैसे एक क्षेत्र, जैसे:

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

या और भी:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

मासिक आँकड़ा रखना है।

धन्यवाद!


1
मुझे लगता है कि यह GROUP BY record_date.MONTHआपके पहले कोड स्निपेट में होना चाहिए था?
चिस्कोदोरो

जवाबों:


1012
GROUP BY YEAR(record_date), MONTH(record_date)

की जाँच करें दिनांक और समय कार्यों MySQL में।


27
आप कुछ मामलों में अतिरिक्त स्पष्टता के लिए एक अतिरिक्त कॉलम जोड़ना चाह सकते हैं जैसे कि रिकॉर्ड जहां कई वर्षों तक फैला हो। चयनित COUNT (Event_id), DATE_FORMAT (Event_start, '% Y /% m')
Ric

सरल पूर्ण उदाहरण: SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);ध्यान दें: record_date एक तिथि प्रकार है TIMESTAMP
renedet

संभवतः यह उल्लेख मेरे MySQL 5.7 पर COUNT अलियास किए गए कॉलम के साथ नहीं चला (कोई त्रुटि नहीं, मुझे शून्य परिणाम मिला)। जब मैं उपनाम के साथ उन क्षेत्रों का चयन करने के लिए बदल गया, मैं तब उपनाम से समूह बना सकता था। यह एक स्थानीय वातावरण में चलने वाली मानक MySQL 5.7 डॉक इमेज है, इसलिए मुझे नहीं पता कि यह त्रुटि या वापसी परिणाम क्यों नहीं था।
MrMesees

3
हे भगवान, अगर मुझे यह पहले से पता था ... तो कुछ करने के लिए PHP की कई लाइनें एक लाइन में mysql कर सकती हैं।
रात

230
GROUP BY DATE_FORMAT(record_date, '%Y%m')

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


3
मुझे लगता है कि यह अच्छा प्रदर्शन नहीं करेगा क्योंकि प्रारूप फ़ंक्शन दिनांक स्तंभ पर एक सूचकांक का उपयोग करने में सक्षम नहीं होगा।
सन्नी

@Stv: आप तब @ फू-ची के जवाब पर विचार करना चाह सकते हैं । जहाँ तक मैं बता सकता हूँ, उस उत्तर और मेरा दोनों में समूहीकरण अभिव्यक्तियाँ एक ही चीज़ का मूल्यांकन करती हैं, लेकिन EXTRACT()इससे अधिक कुशल हो सकती हैं DATE_FORMAT()। (हालांकि, मेरे पास उचित परीक्षण के लिए MySQL नहीं है।)
एंड्री एम

45

इसको आजमाओ

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT (यूनिट फ्रॉम डेट) फंक्शन बेहतर है क्योंकि कम ग्रुपिंग का इस्तेमाल किया जाता है और फ़ंक्शन एक नंबर वैल्यू लौटाता है।

जब DATE_FORMAT फ़ंक्शन (जो एक स्ट्रिंग मान लौटाते हैं) की तुलना में समूहन की स्थिति तेज़ होगी। फ़ंक्शन का उपयोग करने का प्रयास करें। वह क्षेत्र जो SQL तुलनात्मक स्थिति के लिए गैर-स्ट्रिंग मान लौटाता है (WHERE, HAVING, ORDER BY, GROUP BY)।


43

मैंने ऊपर 'WHERE' स्टेटमेंट का उपयोग करने की कोशिश की, मैंने सोचा कि यह सही है क्योंकि किसी ने इसे सही नहीं किया लेकिन मैं गलत था; कुछ खोजों के बाद मुझे पता चला कि यह WHERE स्टेटमेंट के लिए सही फॉर्मूला है इसलिए कोड इस तरह बनता है:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

30

यदि आपकी खोज कई वर्षों से अधिक है, और आप अभी भी मासिक समूह बनाना चाहते हैं, तो मेरा सुझाव है:

संस्करण 1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

संस्करण # 2 (अधिक कुशल) :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

मैंने 1,357,918 पंक्तियों के साथ इन संस्करणों की तुलना एक बड़ी मेज पर की (), और दूसरा संस्करण बेहतर परिणाम देता है।

संस्करण 1 (औसतन 10 निष्पादन) : 1.404 सेकंड
संस्करण 2 (10 निष्पादन का औसत) : 0.780 सेकंड

( SQL_NO_CACHEकुंजी को MySQL को क्वेरी से रोकने के लिए जोड़ा गया है।)


1
अपने परीक्षणों में @ फू-ची के सुझाव को शामिल करने पर विचार करें, यह और भी अधिक कुशल साबित हो सकता है। इसके अलावा, आपने परीक्षण किया GROUP BY YEAR(record_date)*100 + MONTH(record_date), लेकिन परीक्षण क्यों नहीं GROUP BY YEAR(record_date), MONTH(record_date)किया?
एंड्री एम

2
यदि आप COUNT (1) इंस्टिड COUNT (*) का उपयोग करते हैं तो यह और भी तेज़ होगा, और परिणाम डेटा समान हैं।
Pa0l0

2
क्या है कि *100# 2 कविता पर? अग्रिम में धन्यवाद।
एविऑन

1
*100सेYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
फु

17

यदि आप MySQL में दिनांक के अनुसार समूह बनाना चाहते हैं तो नीचे दिए गए कोड का उपयोग करें:

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

आशा है कि यह उन लोगों के लिए कुछ समय बचाता है जो इस धागे को खोजने जा रहे हैं।


6
यह ध्यान रखना महत्वपूर्ण है कि आपको MONTH(record_date)कई महीनों तक समूह बनाने की आवश्यकता होगी ।
वेबनेट

14

यदि आप किसी विशेष वर्ष (जैसे 2000) के लिए रिकॉर्ड फ़िल्टर करना चाहते हैं तो WHEREइस तरह से क्लॉज़ को अनुकूलित करें:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

के बजाय:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

परिणाम तालिका स्तंभ पर 300k पंक्तियों और अनुक्रमणिका वाले तालिका के विरुद्ध उत्पन्न हुए थे।

के रूप में GROUP BYखंड, मैंने कहा तालिका के ऊपर के खिलाफ तीन वेरिएंट परीक्षण किया; यहाँ परिणाम हैं:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

आखिरी वाला विजेता है।


10

वर्तमान में सक्रिय समान रूप से छोटे और अधिक लचीले विकल्प के प्रदर्शन के साथ पूर्ण और सरल समाधान:

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')

7

यदि आप नवीनतम माह द्वारा आदेशित प्रत्येक वर्ष की प्रति माह पंक्ति गणना के साथ एक मासिक आंकड़े प्राप्त करना चाहते हैं, तो यह प्रयास करें:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

7

आप इसे केवल ग्रुप बाय में माईसकल DATE_FORMAT () फंक्शन कर सकते हैं । आप कुछ मामलों में अतिरिक्त स्पष्टता के लिए एक अतिरिक्त कॉलम जोड़ना चाह सकते हैं जैसे कि जहां रिकॉर्ड कई वर्षों तक चलते हैं, वही महीने अलग-अलग वर्षों में होते हैं। इतने सारे विकल्प आप इसे अनुकूलित कर सकते हैं। कृपया इस शुरुआत को पढ़ें। आशा है कि यह आपके लिए बहुत उपयोगी होना चाहिए। यहां आपकी समझ के लिए नमूना क्वेरी है

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

4

निम्न क्वेरी ने मेरे लिए Oracle डेटाबेस 12c रिलीज़ 12.1.0.1.0 में काम किया

SELECT COUNT(*)
FROM stats
GROUP BY 
extract(MONTH FROM TIMESTAMP),
extract(MONTH FROM TIMESTAMP),
extract(YEAR  FROM TIMESTAMP);

2

मैं एक वर्ष के समूह चयन को पसंद करना पसंद करता हूं:

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;

इस तरह आप वर्ष को एक बार में ही बाँध सकते हैं, उदाहरण के लिए '2009', एक नामित पैरामीटर के साथ और अलग से जोड़ने '-01-01'या पास करने के बारे में चिंता करने की आवश्यकता नहीं है '2010'

इसके अलावा, संभवतः हम सिर्फ पंक्तियों की गिनती कर रहे हैं और idकभी नहीं NULL, मैं पसंद COUNT(*)करता हूं COUNT(id)


0

.... group by to_char(date, 'YYYY') -> 1989

.... group by to_char(date,'MM') -> 05

.... group by to_char(date,'DD') ---> 23

.... group by to_char(date,'MON') ---> मई

.... group by to_char(date,'YY') ---> 89


यह बहुत धीमी गति से होगा।
इयरल 3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.