গোষ্ঠীভুক্ত ফলাফলগুলির প্রতিটি গ্রুপের শীর্ষস্থানীয় এন রেকর্ড পান Get


140

নীচে সবচেয়ে সহজ সম্ভাব্য উদাহরণ, যদিও যে কোনও সমাধানের জন্য অনেকগুলি এন ফলাফলের প্রয়োজন হয় তবে স্কেল করতে সক্ষম হওয়া উচিত:

ব্যক্তি, গোষ্ঠী এবং বয়স কলামগুলির সাথে নীচের মতো একটি সারণী দেওয়া হয়েছে, আপনি কীভাবে যাবেন প্রতিটি গ্রুপের 2 জন প্রবীণ ব্যক্তি পাবেন? (গোষ্ঠীগুলির মধ্যে থাকা সম্পর্কগুলি আরও বেশি ফল দেয় না, তবে বর্ণানুক্রমিকভাবে প্রথম 2 দেওয়া উচিত)

+ + -------- + + ------- + + ----- + +
| ব্যক্তি | দল | বয়স |
+ + -------- + + ------- + + ----- + +
| বব | 1 | 32 |
| জিল | 1 | 34 |
| শন | 1 | 42 |
| জ্যাক | 2 | 29 |
| পল | 2 | 36 |
| লরা | 2 | 39 |
+ + -------- + + ------- + + ----- + +

পছন্দসই ফলাফল সেট:

+ + -------- + + ------- + + ----- + +
| শন | 1 | 42 |
| জিল | 1 | 34 |
| লরা | 2 | 39 |
| পল | 2 | 36 |
+ + -------- + + ------- + + ----- + +

দ্রষ্টব্য: এই প্রশ্নটি পূর্ববর্তীটির উপর ভিত্তি করে তৈরি হয়েছে - গ্রুপযুক্ত এসকিউএল ফলাফলের প্রতিটি গ্রুপের সর্বাধিক মান সহ রেকর্ড পান - প্রতিটি গ্রুপ থেকে একক শীর্ষ সারির জন্য এবং যা বোহেমিয়ান থেকে দুর্দান্ত মাইএসকিউএল-নির্দিষ্ট উত্তর পেয়েছে:

select * 
from (select * from mytable order by `Group`, Age desc, Person) x
group by `Group`

আমি এটি দেখতে না পারলেও এটি বন্ধ করতে সক্ষম হতে চাই।



2
এই উদাহরণটি পরীক্ষা করুন। আপনি যা জিজ্ঞাসা করেছেন এটির কাছাকাছি এটি খুব কাছাকাছি: স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি / 1537606/…

গ্রুপ অনুসারে এন ফলাফল পেতে গ্রুপের মধ্যে সীমাবদ্ধ ব্যবহার করছেন? stackoverflow.com/questions/2129693/...
Edye চ্যান

উত্তর:


88

এটি করার একটি উপায় এখানে, UNION ALL( ডেমো সহ এসকিউএল ফিডল দেখুন) )। এটি দুটি গোষ্ঠীর সাথে কাজ করে, আপনার যদি দুটি গ্রুপের বেশি থাকে, তবে আপনাকে অবশ্যই groupনম্বরটি নির্দিষ্ট করতে হবে এবং প্রত্যেকটির জন্য ক্যোয়ারী যুক্ত করতে হবে group:

(
  select *
  from mytable 
  where `group` = 1
  order by age desc
  LIMIT 2
)
UNION ALL
(
  select *
  from mytable 
  where `group` = 2
  order by age desc
  LIMIT 2
)

এটি করার বিভিন্ন উপায় রয়েছে, আপনার পরিস্থিতির জন্য সর্বোত্তম রুট নির্ধারণ করতে এই নিবন্ধটি দেখুন:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

সম্পাদনা:

এটি আপনার পক্ষেও কার্যকর হতে পারে, এটি প্রতিটি রেকর্ডের জন্য একটি সারি নম্বর উত্পন্ন করে। উপরের লিঙ্কটি থেকে উদাহরণ ব্যবহার করে কেবল 2 টির চেয়ে কম বা সমান সংখ্যক সারি সংখ্যার সাথে কেবল সেই রেকর্ডগুলি ফিরে আসবে:

select person, `group`, age
from 
(
   select person, `group`, age,
      (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number 
  from test t
  CROSS JOIN (select @num:=0, @group:=null) c
  order by `Group`, Age desc, person
) as x 
where x.row_number <= 2;

ডেমো দেখুন


52
যদি তার 1,000+ গ্রুপ থাকে তবে এটি কি কিছুটা ভীতিজনক হবে না?
চার্লস ফরেস্ট

1
@ চার্লসফোরস্ট হ্যাঁ, এটি হবে এবং সে কারণেই আমি বলেছি যে আপনাকে এটি দুটি দলের বেশি নির্দিষ্ট করতে হবে। এটি কুরুচিপূর্ণ হয়ে উঠবে।
Taryn

1
@ চার্লসফোরস্ট আমি মনে করি আমি আরও ভাল সমাধান পেয়েছি, আমার সম্পাদনা দেখুন
ট্যারিন

1
এটি পড়ার জন্য প্রত্যেকের জন্য একটি নোট: সংস্করণটি হল ভেরিয়েবলগুলি সঠিক হওয়ার কাছাকাছি। যাইহোক, মাইএসকিউএল SELECT(এবং, সত্যই, কখনও কখনও তাদের বাইরে-অর্ডার মূল্যায়ন করে) এর মধ্যে এক্সপ্রেশনগুলির মূল্যায়নের ক্রমের গ্যারান্টি দেয় না । সমাধানের মূলটি হ'ল সমস্ত ভেরিয়েবল অ্যাসাইনমেন্টকে একক অভিব্যক্তিতে স্থাপন করা; এখানে একটি উদাহরণ: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৩৮৫৩৫০০০/২
গর্ডন লিনফ

1
@ গর্ডনলিনফ আমার উত্তর আপডেট করেছেন, এটি উল্লেখ করার জন্য ধন্যবাদ। এটি আপডেট করতে আমারও অনেক বেশি সময় নিয়েছে।
Taryn

63

অন্যান্য ডাটাবেসে আপনি এটি ব্যবহার করে এটি করতে পারেন ROW_NUMBER। মাইএসকিউএল সমর্থন করে না ROW_NUMBERতবে আপনি এটিকে অনুকরণ করতে ভেরিয়েবলগুলি ব্যবহার করতে পারেন:

SELECT
    person,
    groupname,
    age
FROM
(
    SELECT
        person,
        groupname,
        age,
        @rn := IF(@prev = groupname, @rn + 1, 1) AS rn,
        @prev := groupname
    FROM mytable
    JOIN (SELECT @prev := NULL, @rn := 0) AS vars
    ORDER BY groupname, age DESC, person
) AS T1
WHERE rn <= 2

এটি অনলাইনে কাজ করা দেখুন: স্ক্যালফিল্ডল


সম্পাদনা আমি সবেমাত্র লক্ষ্য করেছি যে ব্লুফীট একটি খুব অনুরূপ উত্তর পোস্ট করেছে: তার কাছে +1। তবে এই উত্তরের দুটি ছোট সুবিধা রয়েছে:

  1. এটি একটি একক জিজ্ঞাসা। ভেরিয়েবলগুলি SELECT স্টেটমেন্টের অভ্যন্তরে সূচনা করা হয়।
  2. প্রশ্নে বর্ণিত হিসাবে এটি বন্ধন পরিচালনা করে (নাম অনুসারে বর্ণানুক্রমিক ক্রম)

সুতরাং এটি কারওর পক্ষে সহায়তা করতে পারে আমি এটিকে এখানে রেখে দেব।


1
মার্ক- এটি আমাদের পক্ষে ভাল কাজ করছে। প্রশংসিত @ ব্লাফীট-এর প্রশংসা করার জন্য আরও একটি ভাল বিকল্প সরবরাহ করার জন্য ধন্যবাদ much
ইয়ারিন

+1 টি। এটি আমার পক্ষে কাজ করেছে। সত্যিই পরিষ্কার এবং মূল উত্তর। আপনি দয়া করে ব্যাখ্যা করতে পারেন এটি ঠিক কীভাবে কাজ করে? এর পিছনে কি যুক্তি?
আদিত্য হাজারে

3
চমৎকার সমাধান তবে এটি আমার পরিবেশে কাজ করছে না বলে মনে হচ্ছে (মাইএসকিউএল ৫..6) কারণ ধারা অনুসারে আদেশ নির্বাচনের পরে প্রয়োগ করা হয়েছে যাতে এটি শীর্ষ ফলটি না ফেরায়, এই সমস্যাটি সমাধানের জন্য আমার বিকল্প সমাধান দেখুন
লরেন্ট পিলে

এটি চালানোর সময় আমি মুছতে সক্ষম হয়েছি JOIN (SELECT @prev := NULL, @rn := 0) AS vars। আমি ধারণা পেয়েছি খালি ভেরিয়েবলগুলি ঘোষণার জন্য, তবে এটি MySQL এর জন্য বহিরাগত বলে মনে হচ্ছে।
জোসেফ চো

1
এটি আমার জন্য মাইএসকিউএল ৫.7 এ দুর্দান্ত কাজ করে তবে এটি কীভাবে কাজ করে তা যদি কেউ ব্যাখ্যা করতে পারে তবে এটি দুর্দান্ত লাগবে
জর্জ বি

41

এটা চেষ্টা কর:

SELECT a.person, a.group, a.age FROM person AS a WHERE 
(SELECT COUNT(*) FROM person AS b 
WHERE b.group = a.group AND b.age >= a.age) <= 2 
ORDER BY a.group ASC, a.age DESC

ডেমো


6
কোথাও থেকে স্নুফিন বেরিয়ে আসল সহজ সমাধান! এটি কি লুডোস / বিল কারভিনের চেয়ে আরও মার্জিত ? আমি কি কিছু মন্তব্য পেতে পারি
ইয়ারিন

এইচএম, এটি আরও মার্জিত কিনা তা নিশ্চিত নন। তবে ভোটগুলি বিবেচনা করে আমার ধারণা, ব্লুফিটের আরও ভাল সমাধান হতে পারে।
স্নফ্ন করুন

2
এটির সাথে একটি সমস্যা আছে। গ্রুপের মধ্যে দ্বিতীয় স্থান অর্জনের জন্য যদি টাই থাকে তবে কেবলমাত্র একটি শীর্ষ ফলাফল ফিরে আসে। পরিবর্তিত ডেমো
ইয়ারিন

2
এটি ইচ্ছা করলে সমস্যা নয়। আপনি অর্ডার সেট করতে পারেন a.person
আলবার্তো লিয়াল

না, এটি আমার ক্ষেত্রে কাজ করছে না, ডেমোও কাজ করে না
Choix

31

স্ব-যোগদানের ব্যবহার সম্পর্কে:

CREATE TABLE mytable (person, groupname, age);
INSERT INTO mytable VALUES('Bob',1,32);
INSERT INTO mytable VALUES('Jill',1,34);
INSERT INTO mytable VALUES('Shawn',1,42);
INSERT INTO mytable VALUES('Jake',2,29);
INSERT INTO mytable VALUES('Paul',2,36);
INSERT INTO mytable VALUES('Laura',2,39);

SELECT a.* FROM mytable AS a
  LEFT JOIN mytable AS a2 
    ON a.groupname = a2.groupname AND a.age <= a2.age
GROUP BY a.person
HAVING COUNT(*) <= 2
ORDER BY a.groupname, a.age DESC;

আমাকে দেয়:

a.person    a.groupname  a.age     
----------  -----------  ----------
Shawn       1            42        
Jill        1            34        
Laura       2            39        
Paul        2            36      

আমি বিল কার্বিনের কাছ থেকে প্রতিটি বিভাগের জন্য শীর্ষ 10 রেকর্ড নির্বাচন করে উত্তরটি দিয়ে প্রেরণা পেয়েছি

এছাড়াও, আমি এসকিউএলাইট ব্যবহার করছি তবে এটি মাইএসকিউএলে কাজ করা উচিত।

আরেকটি জিনিস: উপরের দিকে, আমি সুবিধার জন্য কলামটি groupএকটি groupnameকলাম দিয়ে প্রতিস্থাপন করেছি ।

সম্পাদনা করুন :

টাই ফলাফল হারিয়ে যাওয়ার বিষয়ে ওপির মন্তব্য অনুসরণ করে, আমি সমস্ত সম্পর্ক দেখানোর জন্য স্নুফিনের উত্তরে বাড়িয়েছি। এর অর্থ হ'ল শেষটি যদি বন্ধন হয় তবে নীচে দেখানো হিসাবে 2 টিরও বেশি সারি ফিরে আসতে পারে:

.headers on
.mode column

CREATE TABLE foo (person, groupname, age);
INSERT INTO foo VALUES('Paul',2,36);
INSERT INTO foo VALUES('Laura',2,39);
INSERT INTO foo VALUES('Joe',2,36);
INSERT INTO foo VALUES('Bob',1,32);
INSERT INTO foo VALUES('Jill',1,34);
INSERT INTO foo VALUES('Shawn',1,42);
INSERT INTO foo VALUES('Jake',2,29);
INSERT INTO foo VALUES('James',2,15);
INSERT INTO foo VALUES('Fred',1,12);
INSERT INTO foo VALUES('Chuck',3,112);


SELECT a.person, a.groupname, a.age 
FROM foo AS a 
WHERE a.age >= (SELECT MIN(b.age)
                FROM foo AS b 
                WHERE (SELECT COUNT(*)
                       FROM foo AS c
                       WHERE c.groupname = b.groupname AND c.age >= b.age) <= 2
                GROUP BY b.groupname)
ORDER BY a.groupname ASC, a.age DESC;

আমাকে দেয়:

person      groupname   age       
----------  ----------  ----------
Shawn       1           42        
Jill        1           34        
Laura       2           39        
Paul        2           36        
Joe         2           36        
Chuck       3           112      

@ লুডো- বিল কারভিনের ঠিক উত্তরটি দেখেছি - এটি প্রয়োগ করার জন্য ধন্যবাদ
ইয়্যারিন

স্নুফিনের উত্তর সম্পর্কে আপনি কী ভাবেন? আমি দুজনের তুলনা করার চেষ্টা করছি
ইয়ারিন

2
এটির সাথে একটি সমস্যা আছে। গ্রুপের মধ্যে যদি দ্বিতীয় স্থান অর্জনের জন্য কোনও টাই থাকে, তবে কেবল একটি শীর্ষ ফলাফল ফিরে
আসে-

1
@ লুডো- আসল প্রয়োজনটি ছিল যে প্রতিটি গ্রুপ হ'ল এন ফলাফলগুলি ফিরিয়ে দেবে, কোনও সম্পর্ক বর্ণানুক্রমিকভাবে সমাধান হওয়ার সাথে সাথে
ইয়ারিন

সম্পর্কগুলি অন্তর্ভুক্ত করার সম্পাদনাটি আমার পক্ষে কাজ করে না। আমি পেয়েছি ERROR 1242 (21000): Subquery returns more than 1 row, সম্ভবত কারণ GROUP BY। আমি যখন SELECT MINএকাকী সাবকোয়ারি চালাই, তখন এটি তিনটি সারি উত্পন্ন করে: 34, 39, 112এবং সেখানে এটি দ্বিতীয় মানটি 39 হিসাবে নয় 36 হওয়া উচিত বলে মনে হয়
verbamour

12

আপনার প্রচুর সারি পেয়ে গেলে এবং মার্ক বাইয়ার্স / রিক জেমস এবং ব্লুফিট সমাধানগুলি আমার পরিবেশে কাজ করে না (স্নায়ুফিন সমাধানটি কার্যকর করতে বেশ ধীর বলে মনে হয়) (মাইএসকিউএল 5.6) কারণ আদেশ দ্বারা নির্বাচিত কার্যকর হওয়ার পরে প্রয়োগ করা হয়, সুতরাং এখানে একটি বৈকল্পিক রয়েছে এই সমস্যাটি সমাধানের জন্য মার্ক বাইয়ার্স / রিক জেমস সমাধানগুলির (একটি অতিরিক্ত সংখ্যক নির্বাচন সহ):

select person, groupname, age
from
(
    select person, groupname, age,
    (@rn:=if(@prev = groupname, @rn +1, 1)) as rownumb,
    @prev:= groupname 
    from 
    (
        select person, groupname, age
        from persons 
        order by groupname ,  age desc, person
    )   as sortedlist
    JOIN (select @prev:=NULL, @rn :=0) as vars
) as groupedlist 
where rownumb<=2
order by groupname ,  age desc, person;

আমি 5 মিলিয়ন সারি থাকা একটি টেবিলে অনুরূপ ক্যোয়ারী চেষ্টা করেছি এবং এটি 3 সেকেন্ডেরও কম সময়ে ফল দেয়


3
এটি আমার পরিবেশে কাজ করা একমাত্র ক্যোয়ারী। ধন্যবাদ!
Herrherr

3
যোগ LIMIT 9999999একটি সঙ্গে কোনো উদ্ভূত টেবিলে ORDER BY। এটি উপেক্ষা করা থেকে রোধ করতে পারে ORDER BY
রিক জেমস

আমি কয়েক হাজার সারি সম্বলিত টেবিলে এএ অনুরূপ ক্যোয়ারী চালিয়েছি এবং একটি ফল ফিরে আসতে seconds০ সেকেন্ড সময় লেগেছে, সুতরাং ... পোস্টের জন্য ধন্যবাদ, এটি আমার জন্য একটি সূচনা। (ইটিএ: 5 সেকেন্ডের নিচে। ভাল!)
ইভান

10

এটা দেখ:

SELECT
  p.Person,
  p.`Group`,
  p.Age
FROM
  people p
  INNER JOIN
  (
    SELECT MAX(Age) AS Age, `Group` FROM people GROUP BY `Group`
    UNION
    SELECT MAX(p3.Age) AS Age, p3.`Group` FROM people p3 INNER JOIN (SELECT MAX(Age) AS Age, `Group` FROM people GROUP BY `Group`) p4 ON p3.Age < p4.Age AND p3.`Group` = p4.`Group` GROUP BY `Group`
  ) p2 ON p.Age = p2.Age AND p.`Group` = p2.`Group`
ORDER BY
  `Group`,
  Age DESC,
  Person;

এসকিউএল ফিডল: http://sqlfiddle.com/#!2/cdbb6/15


5
মানুষ, অন্যরা খুব সহজ সমাধান খুঁজে পেল ... আমি এইটির জন্য 15 মিনিটের মতোই সময় কাটিয়েছি এবং এইরকম জটিল সমাধান নিয়ে আসার জন্য আমার নিজের উপর অবিশ্বাস্যরূপে গর্ব হয়েছিল। যে স্তন্যপান।
ট্র্যাভেস্টি 3

আমাকে একটি অভ্যন্তরীণ সংস্করণ নম্বরটি সন্ধান করতে হয়েছিল যা বর্তমানের চেয়ে 1 টি কম ছিল - এটি আমাকে এই কাজটির উত্তর দিয়েছে: max(internal_version - 1)- তাই কম চাপ দিন :)
জেমি স্ট্রস

8

অন্যান্য উত্তরগুলি দ্রুত না হলে এই কোডটি চেষ্টা করে দেখুন:

SELECT
        province, n, city, population
    FROM
      ( SELECT  @prev := '', @n := 0 ) init
    JOIN
      ( SELECT  @n := if(province != @prev, 1, @n + 1) AS n,
                @prev := province,
                province, city, population
            FROM  Canada
            ORDER BY
                province   ASC,
                population DESC
      ) x
    WHERE  n <= 3
    ORDER BY  province, n;

আউটপুট:

+---------------------------+------+------------------+------------+
| province                  | n    | city             | population |
+---------------------------+------+------------------+------------+
| Alberta                   |    1 | Calgary          |     968475 |
| Alberta                   |    2 | Edmonton         |     822319 |
| Alberta                   |    3 | Red Deer         |      73595 |
| British Columbia          |    1 | Vancouver        |    1837970 |
| British Columbia          |    2 | Victoria         |     289625 |
| British Columbia          |    3 | Abbotsford       |     151685 |
| Manitoba                  |    1 | ...

আপনার সাইটে সন্ধান করেছেন - শহরগুলির জনসংখ্যার ডেটা উত্স আমি কোথায় পাব? টিআইএ এবং আরজিএস
ভ্যারেস

maxmind.com/en/worldcities - আমি ল্যাট / এলএনজি অনুসন্ধান , ক্যোয়ারী, পার্টিশন ইত্যাদির জন্য পরীক্ষার জন্য সহজ বলে মনে করি এটি আকর্ষণীয় হওয়ার পক্ষে যথেষ্ট তবে উত্তরগুলি সনাক্ত করার মতো পর্যাপ্ত পাঠযোগ্য। কানাডিয়ান সাবসেট এই ধরণের প্রশ্নের পক্ষে কার্যকর। (মার্কিন শহরগুলির তুলনায় কম প্রদেশগুলি))
রিক জেমস

2

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

SELECT sex, SUBSTRING_INDEX(GROUP_CONCAT(cast(gpa AS char ) ORDER BY gpa desc), ',',5) 
AS subcategories FROM student GROUP BY sex;

নোট করুন যে '5' প্যারামিটারটি প্রতিটি সারিতে কতগুলি এন্ট্রি যুক্ত করতে হবে তা এটি বলে

এবং আউটপুট কিছু চেহারা হবে

+--------+----------------+
| Male   | 4,4,4,4,3.9    |
| Female | 4,4,3.9,3.9,3.8|
+--------+----------------+

আপনি পরিবর্তনশীলও পরিবর্তন করতে পারেন এবং ORDER BYতাদের আলাদাভাবে অর্ডার করতে পারেন । সুতরাং আমার যদি শিক্ষার্থীর বয়স থাকে তবে আমি 'জিপিএ ডেস্ক' কে 'এজ ডেস্ক' দিয়ে প্রতিস্থাপন করতে পারতাম এবং এটি কার্যকর হবে! আউটপুটটিতে আরও কলাম পেতে আপনি স্টেটমেন্টের মাধ্যমে গ্রুপে ভেরিয়েবল যুক্ত করতে পারেন। সুতরাং এটি কেবলমাত্র আমি খুঁজে পেয়েছি যা বেশ নমনীয় এবং ভাল কাজ করে যদি আপনি কেবল তালিকা ফলাফলের সাথে ঠিক থাকেন।


0

এসকিউএল সার্ভারে row_numer()একটি শক্তিশালী ফাংশন যা নীচের মতো সহজেই ফলাফল পেতে পারে

select Person,[group],age
from
(
select * ,row_number() over(partition by [group] order by age desc) rn
from mytable
) t
where rn <= 2

8.0 এবং 10.2 জিএ হওয়ায় এই উত্তরটি যুক্তিসঙ্গত হয়ে উঠছে।
রিক জেমস

@ রিকজেমস 'জিএ হওয়ার' অর্থ কী? উইন্ডো ফাংশন ( dev.mysql.com/doc/refman/8.0/en/window-function.html ) আমার সমস্যাটি খুব ভাল সমাধান করেছে।
iedmrc

1
@iedmrc - "জিএ" এর অর্থ "সাধারণত উপলব্ধ"। এটি "প্রাইম টাইমের জন্য প্রস্তুত", বা "মুক্তি পেয়েছে" জন্য প্রযুক্তিগত speak তারা সংস্করণটি বিকাশ করে চলেছে এবং যে বাগটি তারা মিস করেছে সেগুলিতে মনোনিবেশ করবে। এই লিঙ্কটি মাইএসকিউএল 8.0 এর বাস্তবায়ন নিয়ে আলোচনা করেছে, যা মারিয়াডিবি 10.2 এর প্রয়োগের চেয়ে আলাদা হতে পারে।
রিক জেমস

-1

মাইএসকিউএলে এই সমস্যার একটি দুর্দান্ত উত্তর রয়েছে - প্রতি গ্রুপে শীর্ষস্থানীয় এন সারিগুলি কীভাবে পাবেন

রেফারেন্সড লিঙ্কে সমাধানের ভিত্তিতে, আপনার ক্যোয়ারীটি এমন হবে:

SELECT Person, Group, Age
   FROM
     (SELECT Person, Group, Age, 
                  @group_rank := IF(@group = Group, @group_rank + 1, 1) AS group_rank,
                  @current_group := Group 
       FROM `your_table`
       ORDER BY Group, Age DESC
     ) ranked
   WHERE group_rank <= `n`
   ORDER BY Group, Age DESC;

যেখানে nহয় top nএবংyour_table আপনার টেবিল নাম।

আমি মনে করি রেফারেন্সের ব্যাখ্যাটি সত্যই পরিষ্কার। দ্রুত রেফারেন্সের জন্য আমি এখানে এটি অনুলিপি এবং আটকানো হবে:

বর্তমানে মাইএসকিউএল ROW_NUMBER () ফাংশন সমর্থন করে না যা একটি গ্রুপের মধ্যে একটি সিকোয়েন্স নম্বর নির্ধারণ করতে পারে, তবে কার্যনির্বাহী হিসাবে আমরা মাইএসকিউএল সেশন ভেরিয়েবলগুলি ব্যবহার করতে পারি।

এই ভেরিয়েবলগুলির ঘোষণার প্রয়োজন হয় না, এবং গণনাগুলি করতে এবং মধ্যবর্তী ফলাফলগুলি সঞ্চয় করতে কোনও প্রশ্নের জন্য ব্যবহার করা যেতে পারে।

@ বর্তমান_কাউন্টি: = দেশ এই কোডটি প্রতিটি সারির জন্য কার্যকর করা হয় এবং দেশের কলামের মান @ ক্রিয়াকল_কাউন্ট্রি ভেরিয়েবলে সঞ্চয় করে।

@ কাউন্টি_রঙ্ক: = আইএফ (@ বর্তমান_কাউন্টি = দেশ, @ দেশ_আরঙ্ক + 1, 1) এই কোডটিতে, যদি @ ক্রেন্ট_কাউন্ট্রি একইভাবে আমরা ইনক্রিমেন্ট র‌্যাঙ্ক রাখি, অন্যথায় এটি 1 এ সেট করুন। প্রথম সারির জন্য @ ক্রেন্ট_কাউন্ট্রি নুল, তাই র‌্যাঙ্কটি এছাড়াও 1 সেট।

সঠিক র‌্যাঙ্কিংয়ের জন্য, আমাদের অর্ডারের বাইরের দেশ, জনসংখ্যার ডিইএসসি থাকা দরকার


ঠিক আছে, এটি মার্ক বাইয়ার্স, রিক জেমস এবং মাইনের সমাধানগুলির দ্বারা ব্যবহৃত নীতি।
লরেন্ট পিল

কোন পোস্টটি (স্ট্যাক ওভারফ্লো বা এসকিউএললাইন) প্রথম ছিল তা বলতে অসুবিধা
লরেন্ট পিএলই

@ লরেন্টপ্লে - আমার ফেব্রুয়ারী, ২০১৫ পোস্ট করা হয়েছিল S এসকিউএললাইনে আমি কোনও টাইমস্ট্যাম্প বা নাম দেখছি না। মাইএসকিউএল ব্লগগুলি দীর্ঘকাল ধরে ছিল যেগুলির কয়েকটি পুরানো হয়ে গেছে, এবং তাদের সরানো উচিত - লোকেরা ভুল তথ্যের উদ্ধৃতি দিচ্ছে।
রিক জেমস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.