মাইএসকিউএল ক্যোয়ারী গ্রুপ / মাস / বছর দ্বারা গ্রুপ


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)

মাইএসকিউএলে তারিখ এবং সময় ফাংশনগুলি পরীক্ষা করে দেখুন ।


27
আপনি কিছু ক্ষেত্রে যেমন রেকর্ডগুলি বেশ কয়েক বছর ব্যাপৃত রয়েছে তেমন যুক্ত স্পষ্টতার জন্য অতিরিক্ত কলাম যুক্ত করতে চাইতে পারেন। নির্বাচন করুন COUNT (ইভেন্ট_আইডি), DATE_FORMAT (ইভেন্ট_স্টার্ট, '% ওয়াই /% মি')
রিক

সাধারণ সম্পূর্ণ উদাহরণ: SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);দ্রষ্টব্য: রেকর্ড_ তারিখটি একটি তারিখ টাইম
টাইমস্ট্যাম্প

সম্ভবত এটি উল্লেখ করার মতো এটি আমার মাইএসকিউএল 5.7 এ একটি COUNT টি এলিয়াসেড কলাম দিয়ে চালিত হয়নি (কোনও ত্রুটি নেই, আমি শূন্য ফলাফল পেয়েছি)। আমি যখন উলামের সাহায্যে সেই ক্ষেত্রগুলি নির্বাচন করতে পরিবর্তিত হয়েছি, তখন আমি তার নামটি দ্বারা গ্রুপ করতে পারি। এটি স্থানীয় পরিবেশে স্ট্যান্ডার্ড মাইএসকিউএল 5.7 ডকার চিত্র চলছে তাই এটি কেন ত্রুটি ঘটেনি বা ফলাফলগুলি কেন আসে তা আমি জানি না।
মিঃমিসিজ

3
ওহ godশ্বর, আমি যদি এটি আগে জানতাম ... পিএইচপি এর এতগুলি লাইন মাইএসকিএল করার জন্য এক লাইনে করতে পারে।
রাত

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

দ্রষ্টব্য (প্রাথমিকভাবে সম্ভাব্য ডাউনভোটারদের কাছে)। বর্তমানে, এটি অন্যান্য পরামর্শগুলির মতো দক্ষ নাও হতে পারে। তবুও, আমি এটিকে বিকল্প হিসাবে রেখেছি এবং একটিও, এটি অন্যান্য সমাধানগুলির দ্রুততা কী তা দেখার জন্য পরিবেশন করতে পারে। (কারণ আপনি তফাতটি না দেখলে ধীরে ধীরে আপনি দ্রুত বলতে পারবেন না)) সময় হিসাবে, মাইএসকিউএল এর ইঞ্জিনে অপ্টিমাইজেশনের বিষয়ে পরিবর্তন করা যেতে পারে যাতে এই সমাধানটি তৈরি করা যায়, কিছু ক্ষেত্রে (সম্ভবত, তাই না দূরবর্তী) ভবিষ্যতে পয়েন্ট, বেশিরভাগ অন্যদের সাথে দক্ষতার তুলনায় বেশ তুলনামূলক হয়ে উঠতে।


3
আমার অনুভূতি আছে যে এটি ভাল সঞ্চালন করবে না কারণ একটি ফর্ম্যাট ফাংশন তারিখ কলামে কোনও সূচক ব্যবহার করতে সক্ষম হবে না।
সনি 13

@ স্টিভ: আপনি তখন @ ফু-চি এর উত্তর বিবেচনা করতে চাইতে পারেন । আমি যতদূর বলতে পারি, উত্তর এবং খনি উভয় ক্ষেত্রে গ্রুপিংয়ের প্রকাশগুলি একই জিনিসটির মূল্যায়ন করে তবে এর EXTRACT()চেয়ে কার্যকর হতে পারে DATE_FORMAT()। (আমি সঠিক পরীক্ষার জন্য একটি মাইএসকিউএল, যদিও হবে না।)
আন্দ্রেই এম

45

আর একবার চেষ্টা কর

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

এক্সট্রা্যাক্ট (ইউনিট FROM তারিখ) ফাংশনটি আরও ভাল কারণ কম গ্রুপিং ব্যবহৃত হয় এবং ফাংশনটি একটি সংখ্যা মান দেয়।

গ্রুপিং করার সময় তুলনা শর্ত যখন DATE_FORMAT ফাংশন (যা একটি স্ট্রিংয়ের মান দেয়) এর চেয়ে দ্রুত হবে। ফাংশন | ক্ষেত্রটি ব্যবহার করে দেখুন যা এসকিউএল তুলনা শর্তের জন্য নন-স্ট্রিং মান ফিরে আসে (যেখানে, ক্রমে, অর্ডার দ্বারা, গ্রুপ দ্বারা)।


43

আমি উপরের '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 টি সারি দিয়ে তুলনা করেছি () এবং দ্বিতীয় সংস্করণে আরও ভাল ফলাফল রয়েছে বলে মনে হয়।

version1 (10, executes এর গড়) : 1,404 সেকেন্ড
version2 (10, executes এর গড়) : 0,780 সেকেন্ড

( SQL_NO_CACHEমাইএসকিউএল থেকে ক্যোচিং থেকে ক্যোয়ারিতে আটকাতে চাবি যুক্ত করা হয়েছে))


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

আপনি যদি মাইএসকিউএলে তারিখ অনুসারে গ্রুপ করতে চান তবে নীচের কোডটি ব্যবহার করুন:

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

যারা এই থ্রেডটি সন্ধান করছেন তাদের জন্য এটি কিছুটা সময় সাশ্রয় করবে আশা করি।


6
এটি লক্ষণীয় যে আপনার MONTH(record_date)একাধিক মাস ধরে অ্যাকাউন্ট করার জন্যও গ্রুপ তৈরি করতে হবে important
ওয়েবনেট

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

আপনি GROUP BY এ কেবল মাইএসকিএল DATE_FORMAT () ফাংশনটি করতে পারেন । আপনি কয়েকটি ক্ষেত্রে অতিরিক্ত বর্ণের জন্য অতিরিক্ত কলাম যুক্ত করতে চাইতে পারেন যেমন রেকর্ডগুলি কয়েক বছর ধরে বিস্তৃত হয় একই মাসে বিভিন্ন বছরে ঘটে থাকে so এখানে এতগুলি বিকল্প আপনি এটিকে কাস্টমাইজ করতে পারেন। শুরু করার জন্য এই befor পড়ুন দয়া করে। আশা করি এটি আপনার পক্ষে খুব সহায়ক হবে। আপনার বোঝার জন্য এখানে নমুনা জিজ্ঞাসা

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

নিম্নলিখিত কোয়েরি আমার জন্য ওরাকল ডেটাবেস 12 সি প্রকাশ 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


এটি খুব ধীর হবে।
earl3s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.