Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पंक्तियों की संख्या 30 दिन के डिब्बे में गिनें

कोई संग्रहीत कार्यविधियाँ, अस्थायी तालिकाएँ, केवल एक क्वेरी, और दिनांक स्तंभ पर एक अनुक्रमणिका दी गई एक कुशल निष्पादन योजना:

select

  subdate(
    '2012-12-31',
    floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 + 30 - 1
  ) as "period starting",

  subdate(
    '2012-12-31',
    floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30
  ) as "period ending",

  count(*)

from
  YOURTABLE
group by floor(dateDiff('2012-12-31', dateStampColumn) / 30);

यह स्पष्ट होना चाहिए कि यहाँ क्या हो रहा है, इस मंत्र को छोड़कर:

floor(dateDiff('2012-12-31', dateStampColumn) / 30)

वह व्यंजक कई बार प्रकट होता है, और यह 30 दिन पहले की अवधि का मूल्यांकन करता है dateStampColumn है। dateDiff दिनों में अंतर लौटाता है, इसे 30 दिनों की अवधि में प्राप्त करने के लिए 30 से विभाजित करता है, और यह सब floor() पर फ़ीड करता है इसे एक पूर्णांक में गोल करने के लिए। एक बार हमारे पास यह नंबर हो जाने पर, हम GROUP BY . कर सकते हैं यह, और आगे हम इस संख्या को अवधि की आरंभिक और समाप्ति तिथियों में वापस अनुवाद करने के लिए थोड़ा गणित करते हैं।

बदलें '2012-12-31' now() . के साथ आप चाहें तो। यहां कुछ नमूना डेटा दिया गया है:

CREATE TABLE YOURTABLE
    (`Id` int, `dateStampColumn` datetime);

INSERT INTO YOURTABLE
    (`Id`, `dateStampColumn`)
VALUES
    (1, '2012-10-15 02:00:00'),
    (1, '2012-10-17 02:00:00'),
    (1, '2012-10-30 02:00:00'),
    (1, '2012-10-31 02:00:00'),
    (1, '2012-11-01 02:00:00'),
    (1, '2012-11-02 02:00:00'),
    (1, '2012-11-18 02:00:00'),
    (1, '2012-11-19 02:00:00'),
    (1, '2012-11-21 02:00:00'),
    (1, '2012-11-25 02:00:00'),
    (1, '2012-11-25 02:00:00'),
    (1, '2012-11-26 02:00:00'),
    (1, '2012-11-26 02:00:00'),
    (1, '2012-11-24 02:00:00'),
    (1, '2012-11-23 02:00:00'),
    (1, '2012-11-28 02:00:00'),
    (1, '2012-11-29 02:00:00'),
    (1, '2012-11-30 02:00:00'),
    (1, '2012-12-01 02:00:00'),
    (1, '2012-12-02 02:00:00'),
    (1, '2012-12-15 02:00:00'),
    (1, '2012-12-17 02:00:00'),
    (1, '2012-12-18 02:00:00'),
    (1, '2012-12-19 02:00:00'),
    (1, '2012-12-21 02:00:00'),
    (1, '2012-12-25 02:00:00'),
    (1, '2012-12-25 02:00:00'),
    (1, '2012-12-26 02:00:00'),
    (1, '2012-12-26 02:00:00'),
    (1, '2012-12-24 02:00:00'),
    (1, '2012-12-23 02:00:00'),
    (1, '2012-12-31 02:00:00'),
    (1, '2012-12-30 02:00:00'),
    (1, '2012-12-28 02:00:00'),
    (1, '2012-12-28 02:00:00'),
    (1, '2012-12-30 02:00:00');

और परिणाम:

period starting     period ending   count(*)
2012-12-02          2012-12-31      17
2012-11-02          2012-12-01      14
2012-10-03          2012-11-01      5

अवधि के समापन बिंदु शामिल हैं।

इसके साथ SQL Fiddle में खेलें ।

इसमें कुछ संभावित मूर्खता है कि शून्य मिलान पंक्तियों वाली किसी भी 30 दिन की अवधि को परिणाम में शामिल नहीं किया जाएगा। यदि आप इसे पीरियड्स की तालिका में शामिल कर सकते हैं, तो इसे समाप्त किया जा सकता है। हालांकि, MySQL में PostgreSQL के generate_series() , इसलिए आपको अपने आवेदन में इसका समाधान करना होगा या आज़माएं। यह चतुर हैक



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql में सुंदर सूप वेबस्क्रैप

  2. SQL डेटा प्रकारों का परिचय

  3. NodeJS और mysql:क्वेरी परिणाम की प्रतीक्षा करें

  4. कैसे जांचें कि पाइथन में एक MySQL कनेक्शन खुला है या नहीं?

  5. Mysql डेटाबेस के लिए उपयोगकर्ता नाम और पासवर्ड कैसे पता करें