মাইএসকিউএলে মাস এবং বছর অনুসারে গ্রুপ করুন


99

প্রতিটি সারিতে টাইমস্ট্যাম্প সহ একটি সারণী দেওয়া হয়েছে, কীভাবে আপনি এই নির্দিষ্ট জসন অবজেক্ট ফর্ম্যাটের সাথে মানানসই ক্যোয়ারিকে বিন্যাস করবেন।

আমি একটি জেসন বস্তুকে বছর / মাসগুলিতে সংগঠিত করার চেষ্টা করছি।

জেসন জিজ্ঞাসা বন্ধ বেস:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}

আমার এতক্ষণের ক্যোয়ারী এখানে রয়েছে -

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC";

ক্যোয়ারীটি ভেঙে যাচ্ছে কারণ এটি (পূর্বাভাস) বিভিন্ন বছর একসাথে লম্পিং করছে।

উত্তর:


188
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

আপনি কি চান


63
+1: DATE_FORMAT ব্যবহার করে অন্য একটি বিকল্প :DATE_FORMAT(t.summaryDateTime, '%Y-%m')
ওএমজি পনিস

4
এরপরেও , আপনার ডিবিতে ইউনিক্স টাইমস্ট্যাম্প থাকলে FROM_UNIXTIME প্রয়োজনDATE_FORMAT( FROM_UNIXTIME(t.summaryDateTime), '%Y-%m' )
ডানকানমু

ধন্যবাদ @ ওজিপিওনিগুলি, আপনার সিনট্যাক্সের সাহায্যে আমি শর্তসাপেক্ষে গ্রুপটি সম্পাদন করতে সক্ষম হয়েছি।
হেনরি

পারফরম্যান্স ... 300,000 এন্ট্রি সহ একটি InnoDB টেবিলটিতে আমার GROUP BY YEAR(date), MONTH(date) DESC;(~ 450 এমএস) এবং GROUP BY DATE_FORMAT(date,'%Y-%m')(ms 850 এমএস) পরীক্ষাটি দেখায় যে প্রাক্তন (এই প্রশ্নের চিহ্নিত উত্তর) উত্তর হিসাবে অর্ধেক সময় নিয়েছিল।
ow3n

78
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')

স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! এটি একটি পুরানো এবং ইতিমধ্যে উত্তর দেওয়া প্রশ্ন। আপনি আরও টিস্যু প্রশ্নে অবদান রাখতে পারলে আমরা খুশি হব। আপনি এখানে ভাল উত্তর প্রদান করতে টিপস পেতে পারেন ।
মাইফেট

উপরের উত্তরে আমার মন্তব্য দেখুন ... বড়-ইশ টেবিলগুলিতে এই পদ্ধতিটি দ্বিগুণ সময় নেয়।
ow3n


8
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM trading_summary t
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC

সঠিক ক্রম পেতে YEAR এবং মাস উভয়ের জন্য DESC ব্যবহার করা উচিত।


7

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আপনার যদি ডিবি স্তরে মাসের নাম প্রয়োজন না হয় তবে নিম্নলিখিতগুলি কাজ করা উচিত:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;

এক্সট্রা্যাক্ট ফাংশন ডক্স দেখুন

আপনি সম্ভবত এটি আরও ভাল পারফরম্যান্স করে দেখবেন .. এবং আপনি যদি অ্যাপ্লিকেশন স্তরে কোনও JSON অবজেক্ট তৈরি করে থাকেন তবে ফলাফলের মধ্য দিয়ে চলে যাওয়ার সময় আপনি ফরম্যাটিং / অর্ডারিং করতে পারেন।

এনবি আমি সচেতন ছিলাম না যে আপনি মাইএসকিউএল-এর একটি গ্রুপের মাধ্যমে ডিএসসি যুক্ত করতে পারেন, সম্ভবত আপনি অনুচ্ছেদে অর্ডারটি মিস করছেন:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;

4
দয়া করে মনে রাখবেন যে আউটপুটটি EXTRACT(YEAR_MONTH FROM summaryDateTime)হ'ল201901
এডগার অরতেগা

@ অ্যাডগারআরটেগা হ্যাঁ, তবে এটি অ্যাপ্লিকেশন যুক্তি ব্যবহার করে মূল প্রশ্নে কাঙ্ক্ষিত জেএসওএন অবজেক্ট উত্পন্ন করতে যথেষ্ট হওয়া উচিত। ধরে নেওয়া যে কোয়েরির ফলাফলটি লুপিংয়ের কিছু ফর্ম ইতিমধ্যে ঘটছে, আমার পদ্ধতির লক্ষ্য হ'ল ডিবি থেকে ন্যূনতম প্রয়োজনীয় তথ্য যথাসম্ভব এবং দ্রুত সম্ভব প্রাপ্ত করা
আর্থ

4
আপনি ঠিক বলেছেন, যথেষ্ট হওয়া উচিত। আমার মন্তব্যটি কেবলমাত্র সেই ফাংশন থেকে আউটপুটটি কেমন তা বোঝাতে ছিল, সম্ভবত কেউ সেই ফর্ম্যাটটি পছন্দ করেন না।
এডগার অরতেগা

@ এডগারআরটেগা কোনও উদ্বেগ নেই, ধন্যবাদ, একটি উপযুক্ত অবদান!
আর্থ

2

আপনাকে অবশ্যই এরকম কিছু করতে হবে

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`),
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay

2

আপনি এই কাজটি করতে পারেন

SELECT  SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12

বছর এবং মাস দ্বারা অর্ডার। আসুন আপনাকে এই বছর থেকে এবং এই মাসে 12 মাসের সমস্ত পথেই অর্ডার করতে চান বলে দেয় Le





0
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

তবুও আপনার ঠিক যে কাঠামোটি সন্ধান করছেন তা পেতে আপনাকে এটি বাহ্যিক স্ক্রিপ্টে প্রক্রিয়া করতে হবে।

উদাহরণস্বরূপ, মাসের নামের তালিকা থেকে একটি অ্যারে তৈরি করতে পিএইচপি-র বিস্ফোরণটি ব্যবহার করুন এবং তারপরে json_encode () ব্যবহার করুন


-2

ব্যবহার

GROUP BY year, month DESC";

পরিবর্তে

GROUP BY MONTH(t.summaryDateTime) DESC";

যদিও এটি প্রদর্শিত হয় যে মাসের গ্রুপ (t.SummaryDateTime) কোনও কারণে DESC মাসগুলি যথাযথভাবে অর্ডার করে না ...
ডেরেক আদায়ের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.