মাইএসকিউএল - একাধিক বছরের বেশি সময় ধরে বন্ধনের সাথে বিভিন্ন মাসে সর্বোচ্চ পরিমাণ


9

এই প্রশ্নের দ্বারা অনুপ্রাণিত হয় এই এক [বন্ধ] এবং কার্যত এই অভিন্ন এক কিন্তু বিভিন্ন RDBMS এর ব্যবহার (পোস্টগ্রি বনাম মাইএসকিউএল)।

ধরুন আমার টিউমারগুলির একটি তালিকা রয়েছে (এই ডেটাটি বাস্তব তথ্য থেকে অনুকরণ করা হয়):

CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME);

INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung',   '2018-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Cervix', '2018-02-03 17:50:32');
-- 2017, with 1 Cervix and Lung each for the month of Jan - tie!
INSERT INTO illness VALUES ('Cervix', '2017-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung',   '2017-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung',   '2017-02-03 17:50:32');
INSERT INTO illness VALUES ('Cervix', '2017-02-03 17:50:32');

নির্দিষ্ট মাসে কোন টিউমারটি সবচেয়ে সাধারণ ছিল তা আপনি জানতে চেয়েছেন - এতো ভাল!

এখন, আপনি লক্ষ্য করবেন 2017 মাসের 1, একটি টাই যে - তাই এটা তোলে কোন মানে সবটা তাই বন্ধন অন্তর্ভুক্ত করতে হবে - - এলোমেলোভাবে এক বাছাই এবং যে উত্তর হিসাবে দিতে এই সমস্যা আরো অনেক কিছু চ্যালেঞ্জ করে তোলে।

সঠিক উত্তরটি হ'ল:

  Year    Month  Tumour count      Type
  2017        1             1    Cervix  -- note tie
  2017        1             1      Lung  --   "   "
  2017        2             3      Lung
  2018        1             5    Cervix
  2018        2             3      Lung

আরও একটি বোনাস মাসের নাম পূর্ণসংখ্যার চেয়ে পাঠ্য হিসাবে প্রদর্শিত হবে text

আমার একটি সমাধান আছে তবে এটি বেশ জটিল - আমি জানতে চাই যে আমার সমাধানটি সর্বোত্তম কিনা। মাইএসকিউএল ফিডল এখানে !


আমি বুঝতে পারি এটি একটি এসকিউএল নির্দিষ্ট প্রশ্ন, তবে সময় সিরিজের ডেটাবেস ব্যবহার করে এটি আরও সহজ করা যায়।
সাশ

2
@ সাশ, এটি মাইএসকিউএল / মারিয়াডিবি এর নতুন সংস্করণ সহ বেশিরভাগ এসকিউএল ডিবিএমএসের সাথে অনেক সহজ কাজ করা যায়। মাইএসকিউএল 5.6 এসকিউএল 92 এর পরে উদ্ভাবিত বেশি কার্যকারিতা বাস্তবায়ন করে না।
লেনার্ট

উত্তর:


4

এটি সমাধান করার জন্য আমার প্রচেষ্টাটি নিম্নরূপ। এই ক্যোয়ারীটি কীভাবে উন্নত করা যায় সে সম্পর্কে আমি কোনও পরামর্শের প্রশংসা করব:

SELECT 
  t3.c_year AS "Year",
  t3.c_month AS "Month", 
  t3.il_mc AS  "Tumour count", 
  t4.ill_nat AS "Type" FROM
(
  SELECT c_year, c_month, il_mc FROM
  (
    SELECT  
    c_year, 
    c_month,
    MAX(month_count) AS il_mc
  FROM
    (
      SELECT nature_of_illness as illness,
        EXTRACT(YEAR  FROM created_at) AS c_year,
        EXTRACT(MONTH FROM created_at) AS c_month,
        COUNT(EXTRACT(MONTH FROM created_at)) AS month_count
      FROM illness
      GROUP BY illness, c_year, c_month
      ORDER BY c_year, c_month
    ) AS t1
  GROUP BY c_year, c_month
  ) AS t2
) AS t3
JOIN
(
SELECT 
  EXTRACT(YEAR FROM created_at) AS t_year, 
  EXTRACT(MONTH FROM created_at) AS t_month,  
  nature_of_illness AS ill_nat, 
  COUNT(nature_of_illness) AS ill_cnt
FROM illness
GROUP BY t_year, t_month, nature_of_illness
ORDER BY t_year, t_month, nature_of_illness
) AS t4
ON t3.c_year = t4.t_year
AND t3.c_month = t4.t_month
AND t3.il_mc = t4.ill_cnt

এবং এটি সঠিক ফল দেয় না, যেমন এখানে ফ্রিডলে দেখা যায় !


আমি মনে করি না এটি খুব সহজ করা সম্ভব। যে বিকল্পটি মনে আসবে তা হ'ল বছর এবং তারিখের সর্বাধিক গণনার সমান গণনা পাওয়ার জন্য যোগদানের পরিবর্তে একটি উপ-নির্বাচন। সম্ভব, তবে খুব সহজ। আরেকটি বিকল্প হ'ল ... দ্বারা পার্টিশনকে ওভার র‌্যাঙ্কের () নকল করার জন্য ভেরিয়েবলগুলি ব্যবহার করছে এবং আশা করি যে কোয়েরিটি পরিবর্তিত হওয়ার সময় আপনি একটি নতুন কাজ খুঁজে পেয়েছেন ;-)
লেনার্ট

আশা করি আমরা মাইএসকিউএল 8 তে থাকব এর আগে :-) এর আগে কিছু ঘটবে। এটি শেষ পর্যন্ত মাইএসকিউএলকে একবিংশ শতাব্দীতে নিয়ে আসে! অ্যানালিটিক্স, সিটিইর, যথাযথ আরজিইএক্সএক্সপস - দেখতে দুর্দান্ত লাগছে - যদিও আপনি ইন্টারস্যাক্ট এবং আরও কয়েকটি গ্রিপ করতে পারবেন না, তবে দেখে মনে হচ্ছে ওরাকল সত্যিই এই রিলিজটিতে অনেক কিছু ফেলেছে।
ভোরেস

0

মাইএসকিউএল -৮.০ এবং সিটিই ব্যবহার করে আমরা প্রথমে tmpবছর / মাস / দ্বারা সমষ্টিগত গণনা গোষ্ঠী হিসাবে তৈরি করি nature_of_illness, একই মানটির RANK()জন্য অভিন্ন মান নির্ধারণ করে cযাতে ডুপ্লিকেট সর্বাধিক হিসাবে গণ্য হয়:

 SELECT y as 'Year',mon as 'Month',c as 'Tumor Count', nature_of_illness as 'Type'
 FROM (
   WITH tmp AS ( 
    SELECT YEAR(created_at) as y, MONTH(created_at) as mon, COUNT(*) as c, nature_of_illness
    FROM illness
    GROUP BY y, mon, nature_of_illness
   )
   SELECT y, mon, c, nature_of_illness,
   RANK() OVER (PARTITION BY y, mon ORDER BY c DESC) as `rank`
   FROM tmp
 ) AS tmp2 
WHERE `rank` = 1
ORDER BY y, mon
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.