नमूना डेटा
create table data (Country varchar(10), Number int);
insert into data select
'USA' , 300 union all select
'USA' , 450 union all select
'USA' , 500 union all select
'USA' , 100 union all select
'FR' , 100 union all select
'FR' , 420 union all select
'UK' , 300 union all select
'UK' , 400 union all select
'UK' , 1000;
पहला विकल्प एक छद्म रैंक है जिसमें चर का उपयोग किया जाता है जैसे कि द स्क्रम मिस्टर ने दिखाया है, लेकिन यहां एक ही कथन के रूप में प्रस्तुत किया गया है
SELECT Country, Number
FROM (
SELECT
Number,
@r := case when @c=country then @r+1 else 1 end rownum,
@c := Country Country
FROM (select @r :=0 , @c := '') x, data
ORDER BY Country, Number DESC
) y
WHERE rownum < 3;
यदि आप इसे फ्रंट एंड में उपयोग कर रहे हैं, और केवल 2 काउंट की आवश्यकता है, तो आप इस फॉर्म का उपयोग कर सकते हैं जो एक सूची (सिंगल कॉलम) में काउंट्स लौटाता है
SELECT
Country,
left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
FROM (
SELECT
a.Country,
Group_Concat(a.Number) x
From (
select country, number
from data
order by country, number desc) a
group by a.Country
) b
परिणाम है
"Country";"Numbers"
"FR";"420,100"
"UK";"1000,400"
"USA";"500,450"
यदि संबंधों का होना संभव है, तो दूसरे रूप की यह भिन्नता संबंधों को हटा देती है और रिकॉर्ड के रूप में "प्रति देश शीर्ष 2 अलग-अलग संख्याएं" दिखाती है।
SELECT distinct x.Country, x.Number
From data x
inner join
(
SELECT
Country,
left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
FROM (
SELECT
a.Country,
Group_Concat(a.Number) x
From (
select distinct country, number
from data
order by country, number desc) a
group by a.Country
) b
) y on x.Country=y.Country
and concat(',',y.Numbers,',') like concat('%,',x.Number,',%')
order by x.Country, x.Number Desc
परिणाम
"Country";"Number"
"FR";"420"
"FR";"100"
"UK";"1000"
"UK";"400"
"USA";"500"
"USA";"450"