आप सभी वर्षों को एक एकल स्तंभ में समूहीकृत और क्रमबद्ध करके प्राप्त करने के लिए GROUP_CONCAT कुल फ़ंक्शन का उपयोग कर सकते हैं :idrate
SELECT id, GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM yourtable
GROUP BY id
परिणाम:
-----------------------------------------------------------
| ID | GROUPED_YEAR |
-----------------------------------------------------------
| p01 | 2006,2003,2008,2001,2007,2009,2002,2004,2005,2000 |
| p02 | 2001,2004,2002,2003,2000,2006,2007 |
-----------------------------------------------------------
और फिर आप FIND_IN_SET का उपयोग कर सकते हैं , जो दूसरे के अंदर पहले तर्क की स्थिति देता है, जैसे।
SELECT FIND_IN_SET('2006', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
1
SELECT FIND_IN_SET('2009', '2006,2003,2008,2001,2007,2009,2002,2004,2005,2000');
6
के संयोजन से GROUP_CONCATऔर FIND_IN_SET, और फ़िल्टरिंग का उपयोग करके find_in_set द्वारा लौटाया गया, आप तब इस क्वेरी का उपयोग कर सकते हैं जो प्रत्येक आईडी के लिए केवल पहले 5 वर्ष लौटाती है:
SELECT
yourtable.*
FROM
yourtable INNER JOIN (
SELECT
id,
GROUP_CONCAT(year ORDER BY rate DESC) grouped_year
FROM
yourtable
GROUP BY id) group_max
ON yourtable.id = group_max.id
AND FIND_IN_SET(year, grouped_year) BETWEEN 1 AND 5
ORDER BY
yourtable.id, yourtable.year DESC;
कृपया यहाँ फिडल देखें ।
कृपया ध्यान दें कि यदि एक से अधिक पंक्ति में समान दर हो सकती है, तो आपको वर्ष कॉलम के बजाय दर स्तंभ पर GROUP_CONCAT (DISTINCT दर ORDER BY दर) का उपयोग करने पर विचार करना चाहिए।
GROUP_CONCAT द्वारा लौटाए गए स्ट्रिंग की अधिकतम लंबाई सीमित है, इसलिए यदि आप प्रत्येक समूह के लिए कुछ रिकॉर्ड का चयन करने की आवश्यकता है तो यह अच्छी तरह से काम करता है।
LIMITक्लॉज़ जोड़ने जितना आसान नहीं है । यहां एक लेख है जो समस्या के बारे में विस्तार से बताता है: एसक्यूएल में प्रति समूह में पहली / सबसे कम / अधिकतम पंक्ति का चयन कैसे करें यह एक अच्छा लेख है - वह "टॉप एन प्रति समूह" समस्या का एक सुरुचिपूर्ण लेकिन भोला समाधान प्रस्तुत करता है, और फिर धीरे-धीरे। उस पर सुधार होता है।