গোষ্ঠীযুক্ত এসকিউএল ফলাফলের প্রতিটি গ্রুপের সর্বোচ্চ মান সহ রেকর্ড পান


229

প্রতিটি দলবদ্ধ সেটের সর্বাধিক মান ধারণ করে সারিগুলি কীভাবে পাবেন?

আমি এই প্রশ্নে কিছু অতিরিক্ত-জটিল প্রকরণ দেখেছি এবং ভাল উত্তর নেই with আমি সম্ভাব্যতম উদাহরণটি এক সাথে রাখার চেষ্টা করেছি:

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

Person | Group | Age
---
Bob  | 1     | 32  
Jill | 1     | 34  
Shawn| 1     | 42  
Jake | 2     | 29  
Paul | 2     | 36  
Laura| 2     | 39  

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

Shawn | 1     | 42    
Laura | 2     | 39  

3
সতর্কতা: গৃহীত উত্তরটি যখন এটি লেখা হয়েছিল তখন ২০১২ সালে কাজ করেছিল। যাইহোক, মন্তব্যগুলিতে দেওয়া হিসাবে এটি আর একাধিক কারণে কাজ করে না।
রিক জেমস

উত্তর:


132

মাইএসকিএলে এটি করার একটি দুর্দান্ত-সহজ উপায় রয়েছে:

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

এটি কাজ করে কারণ মাইএসকিএল-এ আপনাকে অ-গ্রুপ-বাই কলামগুলি একত্রিত করার অনুমতি দেওয়া হয়নি , সেক্ষেত্রে মাইএসকিএল কেবল প্রথম সারিতে ফিরে আসে । সমাধানটি হ'ল প্রথমে ডেটা অর্ডার করা যাতে প্রতিটি গ্রুপের জন্য আপনি যে সারিটি চান তা প্রথমে, তারপরে কলামগুলির দ্বারা গ্রুপ করুন যার জন্য আপনি মান চান।

আপনি জটিল সাব-কোয়েরিগুলি এড়ান যা এগুলি সন্ধান করার চেষ্টা করে max()এবং একই সাথে সর্বাধিক মান সহ যখন একাধিক থাকে তখন একাধিক সারি ফেরত দেওয়ার সমস্যাগুলি (অন্যান্য উত্তরগুলি যেমন করে থাকে)

দ্রষ্টব্য: এটি মাইএসকিএল-কেবলমাত্র সমাধান। আমি জানি অন্য সমস্ত ডাটাবেস "এসিডকিউল সিনট্যাক্স ত্রুটিটি" নন সমষ্টিযুক্ত কলামগুলি দলে দলে তালিকাভুক্ত নয় "বা অনুরূপ বার্তা সহ নিক্ষেপ করবে। কারণ এই সমাধান ব্যবহার করে অনথিভুক্ত আচরণ, আরো সতর্ক জাহির করা একটি পরীক্ষা অন্তর্ভুক্ত করতে চান যে এটা রয়ে কাজ মাইএসকিউএল এর ভবিষ্যতে সংস্করণ এই আচরণ পরিবর্তন করা উচিত নয়।

সংস্করণ 5.7 আপডেট:

সংস্করণ ৫.7 থেকে, sql-modeসেটিংটি ONLY_FULL_GROUP_BYডিফল্টরূপে অন্তর্ভুক্ত রয়েছে , সুতরাং এই কাজটি করতে আপনার এই বিকল্পটি থাকা উচিত নয় (সার্ভারের জন্য এই সেটিংসটি সরিয়ে ফেলার জন্য বিকল্প ফাইলটি সম্পাদনা করুন)।


66
"মাইএসকিএল সবেমাত্র প্রথম সারিতে ফিরে আসে।" - সম্ভবত এটি এটি কিভাবে কাজ করে তবে এটির কোনও গ্যারান্টি নেই। ডকুমেন্টেশন বলেছেন: "সার্ভার প্রতিটি গ্রুপ থেকে কোন মান চয়ন করতে বিনামূল্যে, তাই যদি না তারা একই, মান মনোনীত অনির্দিষ্ট আছে।" । সার্ভারটি প্রতিটি কলাম বা অভিব্যক্তির জন্য সারণিগুলি সারণি নয় তবে মানগুলি (একই সারি থেকে অগত্যা প্রয়োজন) নির্বাচন করে না SELECTযা একটি সামগ্রিক ফাংশন ব্যবহার করে গণনা করা হয় না।
axiac

16
এই আচরণটি মাইএসকিউএল 7.7.৫ এ পরিবর্তিত হয়েছে এবং ডিফল্টরূপে এটি এই কোয়েরিকে প্রত্যাখ্যান করে কারণ ধারাটিতে থাকা কলামগুলি কলামগুলির উপর কার্যতSELECT নির্ভর করে না GROUP BY। যদি এটি স্বীকার করার জন্য এটি কনফিগার করা থাকে (`কেবলমাত্র_এফএলএলল_গ্রোপ_বিওয়াই অক্ষম), এটি পূর্ববর্তী সংস্করণগুলির মতো কাজ করে (যেমন those কলামগুলির মানগুলি অনির্দিষ্ট)।
axiac

17
আমি উত্তর পেয়েছি এত উত্তর পেয়েছি আমি অবাক। এটা ভুল এবং এটি খারাপ। এই কোয়েরিটি কাজের গ্যারান্টিযুক্ত নয়। একটি সাবকিউয়ের তথ্য ডেটা ধারা দ্বারা আদেশ সত্ত্বেও একটি আনর্ডারড সেট। মাইএসকিউএল এখনই রেকর্ডগুলি অর্ডার করতে পারে এবং সেই অর্ডারটি রাখতে পারে, তবে ভবিষ্যতের সংস্করণে এটি করা বন্ধ করে দিলে এটি কোনও নিয়ম ভঙ্গ করবে না। তারপরে GROUP BYকনডেন্সগুলি একটি রেকর্ডে চলেছে , তবে সমস্ত ক্ষেত্রগুলি নির্বিচারে রেকর্ড থেকে নেওয়া হবে। এটি হতে পারে যে মাইএসকিউএল কেবল সর্বদা প্রথম সারিকে পছন্দ করে, তবে এটি ভবিষ্যতের সংস্করণে বিভিন্ন সারি থেকে অন্য কোনও সারি বা এমনকি মানগুলিও বেছে নিতে পারে ।
থারস্টন কেটনার

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

3
এই উত্তরটি ভুল বলে মনে হচ্ছে। প্রতি ডক , সার্ভার প্রতিটি গ্রুপ ... তদ্ব্যতীত, প্রতিটি গ্রুপ থেকে মানগুলির নির্বাচন দফার মাধ্যমে একটি আদেশ যুক্ত করে প্রভাবিত করা যাবে না থেকে কোন মান চয়ন করতে হয় বিনামূল্যে। মানগুলি নির্বাচনের পরে ফলাফল নির্ধারণ বাছাই হয় এবং অর্ডার বাই দ্বারা প্রতিটি গ্রুপের মধ্যে সার্ভারটি কোন মানটি পছন্দ করে তা প্রভাবিত করে না।
Tgr

296

সঠিক সমাধানটি হ'ল:

SELECT o.*
FROM `Persons` o                    # 'o' from 'oldest person in group'
  LEFT JOIN `Persons` b             # 'b' from 'bigger age'
      ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL                 # bigger age not found

কিভাবে এটা কাজ করে:

এটি কলামের একই মান এবং কলামে আরও বড় মানের oথেকে সমস্ত সারিটির সাথে প্রতিটি সারি মিলে । কলামে এর গ্রুপের সর্বাধিক মান না পাওয়া যে কোনও সারি এর থেকে এক বা একাধিক সারি মেলে ।bGroupAgeoAgeb

LEFT JOINএটা পূর্ণ একটি সারি সঙ্গে (ব্যক্তি যে তাদের দলের একা সহ) দলের সবচেয়ে বয়স্ক ব্যক্তি মেলে তোলে NULLএর থেকে b( 'গোষ্ঠীতে কোনো বড় বয়স')।
ব্যবহারের INNER JOINফলে এই সারিগুলি মিলছে না এবং এগুলি উপেক্ষা করা হবে।

WHEREদফা শুধুমাত্র থাকার সারি রাখে NULLথেকে নিষ্কাশিত ক্ষেত্রের মধ্যে গুলি b। তারা প্রতিটি গ্রুপের প্রবীণ ব্যক্তি।

আরও পড়া

এই সমাধান এবং আরও অনেককে এসকিউএল অ্যান্টিপ্যাটার্নস বইটিতে ব্যাখ্যা করা হয়েছে : ডেটাবেস প্রোগ্রামিংয়ের ক্ষতিগুলি এড়ানো


43
বিটিডব্লিউ এটি একই গ্রুপের জন্য দুটি বা ততোধিক সারি ফিরতে পারে যদি o.Age = b.Age, উদাহরণস্বরূপ, যদি গ্রুপ 2 এর পল লরার মতো 39-তে থাকে। তবে আমরা যদি এমন আচরণ না চান তবে আমরা এটি করতে পারি:ON o.Group = b.Group AND (o.Age < b.Age or (o.Age = b.Age and o.id < b.id))
টডর

8
অবিশ্বাস্য! 20 এম রেকর্ডের জন্য এটি "নিষ্পাপ" অ্যালগরিদমের চেয়ে 50 গুণ বেশি দ্রুত (সর্বোচ্চ () সহ একটি সাবকিউয়ের বিপরীতে যোগ দিন)
user2706534

3
@ টিডার মন্তব্য সহ পুরোপুরি কাজ করে। আমি যুক্ত করব যে যদি আরও প্রশ্নের শর্ত থাকে তবে সেগুলি অবশ্যই এফআরএম এবং বাম জোনে যোগ করা উচিত। কিছু পছন্দ করুন: থেকে থেকে (যেকোন বয়স থেকে ব্যক্তি থেকে নির্বাচন করুন! = 32) o বাম যোগদান করুন (বয়স থেকে পৃথক * নির্বাচন করুন! = 32) খ - আপনি যদি 32
বছরের

1
@ অ্যালাইনজিলিংক কি সাবকিউরিটি চালু না করার জন্য এই "আরও প্রশ্নের শর্তগুলি" চূড়ান্ত কোথায় শর্ত তালিকায় রাখা উচিত নয় - যা মূল @ অক্ষর জবাবের প্রয়োজন ছিল না?
তারিলাব

5
এই সমাধান কাজ করে; যাইহোক, একই আইডিটি ভাগ করে নেওয়ার জন্য 10,000+ সারি ব্যবহার করার চেষ্টা করার পরে ধীর ক্যোয়ারী লগটিতে এটি প্রতিবেদন করা শুরু হয়েছিল। ইনডেক্সড কলামে যোগ দিচ্ছিল। একটি বিরল কেস, তবে এটি উল্লেখযোগ্য।
চেসাইসবেলে

49

আপনি এমন একটি সাবকিউয়ের বিপরীতে যোগ দিতে পারেন যা MAX(Group)এবং কে টানবে Age। এই পদ্ধতিটি বেশিরভাগ আরডিবিএমএসে বহনযোগ্য।

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT `Group`, MAX(Age) AS max_age
    FROM yourTable
    GROUP BY `Group`
) t2
    ON t1.`Group` = t2.`Group` AND t1.Age = t2.max_age;

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

1
@ ইয়্যারিন যদি উদাহরণস্বরূপ 2 টি সারি Group = 2, Age = 20থাকত তবে সাবকিউরিগুলি তাদের মধ্যে একটি ফেরত দেয় তবে জয়েন্ট ক্লজটি উভয়েরON সাথে মেলে , তাই আপনি অন্য কলামগুলির জন্য পৃথক ভল যদিও একই গ্রুপ / বয়সের সাথে 2 সারি ফিরে পাবেন, বরং এক।
মাইকেল বার্কোভস্কি

সুতরাং আমরা কি বলছি যে আমরা বোহেমিয়ানস মাইএসকিউএল-একমাত্র রুটে না গেলে ফলাফল প্রতি গ্রুপে একের মধ্যে সীমাবদ্ধ করা অসম্ভব?
ইয়ারিন

@ ইয়্যারিন কোনও অসম্ভব নয়, কেবলমাত্র অতিরিক্ত কলাম থাকলে আরও কাজ করা দরকার - সম্ভবত গ্রুপ / বয়সের প্রতিটি জোড়ের জন্য সর্বাধিক সম্পর্কিত আইডি টানতে অন্য নেস্টেড সাবকোয়ারি, তারপরে আইডির উপর ভিত্তি করে বাকী সারির জন্য এটি যোগ করুন।
মাইকেল বার্কোভস্কি

এটি স্বীকৃত উত্তর হওয়া উচিত (বর্তমানে গৃহীত উত্তরগুলি বেশিরভাগ অন্যান্য আরডিবিএমএসে ব্যর্থ হবে এবং বাস্তবে মাইএসকিউএল এর অনেকগুলি সংস্করণেও ব্যর্থ হবে)।
টিম বিজিলেইসেন

28

এসকিউএলাইট (এবং সম্ভবত মাইএসকিউএল) এর জন্য আমার সহজ সমাধান:

SELECT *, MAX(age) FROM mytable GROUP BY `Group`;

তবে এটি পোস্টগ্রিজ এসকিউএল এবং সম্ভবত কিছু অন্যান্য প্ল্যাটফর্মে কাজ করে না।

পোস্টগ্রিজ এসকিউএলএ আপনি ক্লজ অন ​​ডিসট্রিক্ট ব্যবহার করতে পারেন :

SELECT DISTINCT ON ("group") * FROM "mytable" ORDER BY "group", "age" DESC;

@ বোহেমিয়ান দুঃখিত, আমি এটি জানতে পেরেছি, এটি মাইএসকিউএল কেবলমাত্র এতে অ-সংগৃহীত কলামগুলি অন্তর্ভুক্ত রয়েছে
সিইসি

2
@ ইগরকুলগিন - পোস্টগ্র্রেসে কাজ করে না - ত্রুটি বার্তায়: কলাম "মাইটিবেল.আইডি" অবশ্যই গ্রুপ বা গ্রুপে উপস্থিত থাকতে হবে বা একটি সামগ্রিক ফাংশনে ব্যবহৃত হবে
ইয়্যারিন ২

13
মাইএসকিউএল ক্যোয়ারী অনেক সময় দুর্ঘটনাক্রমে কাজ করতে পারে। "নির্বাচন *" এমন তথ্য ফিরে আসতে পারে যা ম্যাক্সের সাথে সম্পর্কিত নয় (বয়স)। এই উত্তরটি ভুল। এটি সম্ভবত এসকিউএলাইটের ক্ষেত্রেও।
অ্যালবার্ট হেন্ডরিক্স 11:56

2
তবে এটি সেই ক্ষেত্রে খাপ খায় যেখানে আমাদের দলবদ্ধ কলাম এবং সর্বোচ্চ কলামটি নির্বাচন করতে হবে to এটি ফলাফলের উপরোক্ত প্রয়োজনীয়তার সাথে খাপ খায় না ('বব', 1, 42) তবে প্রত্যাশিত ফলাফলটি ('শান', 1, 42)
রাম বাবু এস


4

র‌্যাঙ্কিং পদ্ধতি ব্যবহার করা।

SELECT @rn :=  CASE WHEN @prev_grp <> groupa THEN 1 ELSE @rn+1 END AS rn,  
   @prev_grp :=groupa,
   person,age,groupa  
FROM   users,(SELECT @rn := 0) r        
HAVING rn=1
ORDER  BY groupa,age DESC,person

বিক্রয় - কিছু ব্যাখ্যা দরকার - আমি এর আগে কখনও দেখিনি :=- সে কী?
ইয়ারিন

1
: = হ'ল এসাইনমেন্ট অপারেটর। আপনি আরো পড়তে পারি dev.mysql.com/doc/refman/5.0/en/user-variables.html
SEL

আমাকে এটি খনন করতে হবে - আমি মনে করি উত্তরটি আমাদের দৃশ্যের সাথে জড়িত, তবে আমাকে নতুন কিছু শেখানোর জন্য ধন্যবাদ ..
ইয়ারিন

3

মাইএসকিউএল এর সারি_ সংখ্যা সংখ্যা রয়েছে কিনা তা নিশ্চিত নয়। যদি তাই হয় তবে আপনি পছন্দসই ফলাফল পেতে এটি ব্যবহার করতে পারেন। এসকিউএল সার্ভারে আপনি এর মতো কিছু করতে পারেন:

CREATE TABLE p
(
 person NVARCHAR(10),
 gp INT,
 age INT
);
GO
INSERT  INTO p
VALUES  ('Bob', 1, 32);
INSERT  INTO p
VALUES  ('Jill', 1, 34);
INSERT  INTO p
VALUES  ('Shawn', 1, 42);
INSERT  INTO p
VALUES  ('Jake', 2, 29);
INSERT  INTO p
VALUES  ('Paul', 2, 36);
INSERT  INTO p
VALUES  ('Laura', 2, 39);
GO

SELECT  t.person, t.gp, t.age
FROM    (
         SELECT *,
                ROW_NUMBER() OVER (PARTITION BY gp ORDER BY age DESC) row
         FROM   p
        ) t
WHERE   t.row = 1;

1
এটি 8.0 থেকে, করে।
ইলজা এভারিলä

2

অক্ষের সমাধানটিই আমার পক্ষে শেষ পর্যন্ত সবচেয়ে ভাল কাজ করেছে। আমার অবশ্য অতিরিক্ত জটিলতা ছিল: একটি গণনা করা "সর্বোচ্চ মান", দুটি কলাম থেকে প্রাপ্ত।

আসুন একই উদাহরণটি ব্যবহার করুন: আমি প্রতিটি গ্রুপের সবচেয়ে বয়স্ক ব্যক্তিটি চাই। যদি সমান বয়স্ক লোক থাকে তবে লম্বা ব্যক্তিকে নিয়ে যান।

এই আচরণটি পেতে আমাকে দু'বার বামে যোগদান করতে হয়েছিল:

SELECT o1.* WHERE
    (SELECT o.*
    FROM `Persons` o
    LEFT JOIN `Persons` b
    ON o.Group = b.Group AND o.Age < b.Age
    WHERE b.Age is NULL) o1
LEFT JOIN
    (SELECT o.*
    FROM `Persons` o
    LEFT JOIN `Persons` b
    ON o.Group = b.Group AND o.Age < b.Age
    WHERE b.Age is NULL) o2
ON o1.Group = o2.Group AND o1.Height < o2.Height 
WHERE o2.Height is NULL;

আশাকরি এটা সাহায্য করবে! আমার ধারণা, এটি করার আরও ভাল উপায় থাকা উচিত ...


2

আমার সমাধানটি কেবল তখনই কার্যকর হয় যখন আপনার কেবলমাত্র একটি কলাম পুনরুদ্ধার করতে হবে, তবে আমার প্রয়োজনগুলির জন্য পারফরম্যান্সের ক্ষেত্রে সবচেয়ে ভাল সমাধানটি পাওয়া গেল (এটিতে কেবল একটি একক ক্যোয়ারী ব্যবহার করা হয়েছে!):

SELECT SUBSTRING_INDEX(GROUP_CONCAT(column_x ORDER BY column_y),',',1) AS xyz,
   column_z
FROM table_name
GROUP BY column_z;

অর্ডারযুক্ত কনক্যাট তালিকা তৈরি করতে এটি GROUP_CONCAT ব্যবহার করে এবং তারপরে আমি কেবল প্রথমটিতে সাবস্ট্রিং করি।


আপনি গ্রুপ_কোঙ্কটের ভিতরে একই কী বাছাই করে একাধিক কলাম পেতে পারবেন তা নিশ্চিত করতে পারেন, তবে প্রতিটি কলামের জন্য পৃথক গ্রুপ_কনক্যাট / সূচক / স্ট্রিং লিখতে হবে।
রসিকা

এখানে বোনাসটি হ'ল আপনি গ্রুপ_কোঙ্কটের অভ্যন্তরে বাছাই করতে একাধিক কলাম যুক্ত করতে পারেন এবং এটি সহজেই সম্পর্কগুলি সমাধান করে এবং প্রতি গ্রুপে কেবল একটি রেকর্ডের গ্যারান্টি দেয়। সহজ এবং দক্ষ সমাধান ভাল কাজ!
রসিকা

2

আমি ব্যবহার করে একটি সহজ সমাধান আছে WHERE IN

SELECT a.* FROM `mytable` AS a    
WHERE a.age IN( SELECT MAX(b.age) AS age FROM `mytable` AS b GROUP BY b.group )    
ORDER BY a.group ASC, a.person ASC

1

সিটিই ব্যবহার করে - সাধারণ সারণী এক্সপ্রেশন:

WITH MyCTE(MaxPKID, SomeColumn1)
AS(
SELECT MAX(a.MyTablePKID) AS MaxPKID, a.SomeColumn1
FROM MyTable1 a
GROUP BY a.SomeColumn1
  )
SELECT b.MyTablePKID, b.SomeColumn1, b.SomeColumn2 MAX(b.NumEstado)
FROM MyTable1 b
INNER JOIN MyCTE c ON c.MaxPKID = b.MyTablePKID
GROUP BY b.MyTablePKID, b.SomeColumn1, b.SomeColumn2

--Note: MyTablePKID is the PrimaryKey of MyTable

1

ওরাকলে নীচে ক্যোয়ারী পছন্দসই ফলাফল দিতে পারে।

SELECT group,person,Age,
  ROWNUMBER() OVER (PARTITION BY group ORDER BY age desc ,person asc) as rankForEachGroup
  FROM tablename where rankForEachGroup=1

0
with CTE as 
(select Person, 
[Group], Age, RN= Row_Number() 
over(partition by [Group] 
order by Age desc) 
from yourtable)`


`select Person, Age from CTE where RN = 1`

0

আপনি চেষ্টা করতে পারেন

SELECT * FROM mytable WHERE age IN (SELECT MAX(age) FROM mytable GROUP BY `Group`) ;

1
ধন্যবাদ, যদিও এটি কোনও বয়সের জন্য একাধিক রেকর্ড দেয় যখন একটি টাই থাকে
ইয়ারিন

এছাড়াও, এই কোয়েরিটি ভুল হবে যে 1 টি গ্রুপে 39 বছর বয়সী রয়েছে সেই ক্ষেত্রে, সেই গোষ্ঠীটিতে 1 এর সর্বাধিক বয়স বেশি হওয়া সত্ত্বেও সেই ব্যক্তিটিও নির্বাচন করা হবে would
জোশুয়া রিচার্ডসন

0

আমি গ্রুপটি কলামের নাম হিসাবে ব্যবহার করব না কারণ এটি সংরক্ষিত শব্দ। তবে নিম্নলিখিত এসকিউএল কাজ করবে।

SELECT a.Person, a.Group, a.Age FROM [TABLE_NAME] a
INNER JOIN 
(
  SELECT `Group`, MAX(Age) AS oldest FROM [TABLE_NAME] 
  GROUP BY `Group`
) b ON a.Group = b.Group AND a.Age = b.oldest

ধন্যবাদ, যদিও এটি কোনও বয়সের জন্য একাধিক রেকর্ড দেয় যখন একটি টাই থাকে
ইয়ারিন

@ ইয়্যারিন কীভাবে সিদ্ধান্ত নেবেন সঠিক বয়স্ক ব্যক্তি কোনটি? একাধিক উত্তর হ'ল যথাযথ উত্তর বলে অন্যথায় সীমাবদ্ধতা এবং শৃঙ্খলা ব্যবহার করুন
ডানকান

0

এই পদ্ধতিটি আপনাকে একটি পৃথক কলাম দ্বারা র‌্যাঙ্ক করার অনুমতি দেয় এবং অন্যান্য ডেটা ট্র্যাশ না করে benefit এটি এমন পরিস্থিতিতে বেশ কার্যকর যেখানে আপনি প্রথমে সবচেয়ে ভারী তালিকাবদ্ধ করার জন্য আইটেমগুলির জন্য একটি কলাম দিয়ে অর্ডার তালিকাভুক্ত করার চেষ্টা করছেন।

সূত্র: http://dev.mysql.com/doc/refman/5.0/en/group-by-function.html#function_group-concat

SELECT person, group,
    GROUP_CONCAT(
        DISTINCT age
        ORDER BY age DESC SEPARATOR ', follow up: '
    )
FROM sql_table
GROUP BY group;

0

টেবিলের নাম মানুষ হতে দিন

select O.*              -- > O for oldest table
from people O , people T
where O.grp = T.grp and 
O.Age = 
(select max(T.age) from people T where O.grp = T.grp
  group by T.grp)
group by O.grp; 

0

যদি Mytable থেকে আইডি (এবং সমস্ত culmns) প্রয়োজন হয়

SELECT
    *
FROM
    mytable
WHERE
    id NOT IN (
        SELECT
            A.id
        FROM
            mytable AS A
        JOIN mytable AS B ON A. GROUP = B. GROUP
        AND A.age < B.age
    )

0

এইভাবে আমি মাইএসকিএলে প্রতি গ্রুপে এন সর্বাধিক সারি পাচ্ছি

SELECT co.id, co.person, co.country
FROM person co
WHERE (
SELECT COUNT(*)
FROM person ci
WHERE  co.country = ci.country AND co.id < ci.id
) < 1
;

কিভাবে এটা কাজ করে:

  • স্ব টেবিলে যোগদান
  • গ্রুপ দ্বারা করা হয় co.country = ci.country
  • প্রতি গ্রুপে এন উপাদানগুলি ) < 13 উপাদান -) <3 এর জন্য নিয়ন্ত্রণ করে
  • সর্বাধিক বা কমপক্ষে পাওয়ার উপর নির্ভর করে: co.id < ci.id
    • co.id <ci.id - সর্বাধিক
    • co.id> ci.id - মিনিট

এখানে সম্পূর্ণ উদাহরণ:

mysql প্রতিটি গ্রুপে এন সর্বাধিক মান নির্বাচন করুন

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