आप GROUP_CONCAT
का उपयोग कर सकते हैं id
. द्वारा समूहीकृत, सभी वर्षों को एक ही कॉलम में लाने के लिए समेकित कार्य और rate
. द्वारा आदेशित किया गया :
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 |
-----------------------------------------------------------
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 द्वारा लौटाई गई स्ट्रिंग की अधिकतम लंबाई सीमित है, इसलिए यदि आपको प्रत्येक समूह के लिए कुछ रिकॉर्ड चुनने की आवश्यकता है तो यह अच्छी तरह से काम करता है।