2012-07-10 15 views
10

नीचे मेरी टेबलएसक्यूएल चुनिंदा समूह क्वेरी

Table1

है
+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 100 | Nokia | Mobiles | 
| 300 | Samesung | Mobiles | 
| 700 | Micromax | Mobiles | 
| 1000 | Karbonn | Mobiles | 
| 500 | Lava  | Mobiles | 
| 100 | Floyer | Gift | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

अब मैं प्रत्येक उत्पाद के लिए दो सबसे अधिक राशि प्रदर्शित करना चाहते हैं ...

तो मैं एक SQL क्वेरी निर्माण करना चाहते हैं जो मुझे नीचे के रूप में परिणाम देता है ..

+--------+----------+---------+ 
| amount | make  | product | 
+--------+----------+---------+ 
| 1000 | Karbonn | Mobiles | 
| 700 | Micromax | Mobiles | 
| 500 | Arichies | Gift | 
| 300 | Feeling | Gift | 
+--------+----------+---------+ 

कृपया मुझे इस तरह के प्रश्न का निर्माण करने में मदद ..

उत्तर

10

आप "समूह के लिहाज से अधिकतम" amount के आधार पर पुनः प्राप्त करने के इस समाधान का उपयोग कर सकते हैं:

SELECT a.* 
FROM Table1 a 
INNER JOIN Table1 b ON a.product = b.product AND a.amount <= b.amount 
GROUP BY a.amount, a.product 
HAVING COUNT(*) <= 2 

सीधे शब्दों में हालांकि शीर्ष पंक्तियों आप प्रति प्राप्त करना चाहते हैं के कई 2 करने के लिए बदल उत्पाद।

यदि आप प्रति उत्पाद की सबसे कम दो पंक्तियां पुनर्प्राप्त करना चाहते हैं, तो आप <=INNER JOIN पर >= पर साइन इन कर सकते हैं।

आप इस यहाँ समाधान के साथ बेला के आसपास कर सकते हैं: SQL-Fiddle Demo

0
select top 2 amount, make, product from table1 
where product='Mobiles' 
order by amount desc 
union 
select top 2 amount, make, product from table1 
where product='Gift' 
order by amount desc 
+0

का उत्तर सामान्य नहीं है। यदि आपके पास 100 उत्पाद हैं तो क्या होगा? –

4
select product, make, amount, rnk 
from (
    select l.product, l.make, l.amount, count(*) as rnk 
    from table1 as l 
    left join table1 as r 
    on (r.product = l.product and l.amount <= r.amount) 
    group by l.product, l.make 
) a 
where rnk <= 2 

ideea और अन्य उदाहरण यहाँ देखें: http://www.xaprb.com/blog/2005/09/27/simulating-the-sql-row_number-function/

और sql fiddle Zane बिएन परीक्षण डेटा के आधार पर।

0

आप दो तरह से यह कर सकते हैं: 1) पंक्ति सूचकांक स्तंभ है कि आदेश को प्रतिबिंबित करेगा और उसके बाद पंक्ति < साथ = 2

सभी पंक्तियों का चयन करें
SELECT amount, make,product 
FROM 
(SELECT ROW_NUMBER() OVER (PARTITION BY [product] ORDER BY [amount] DESC) AS [RowID],* 
FROM [dbo].[Table1]) RESULT 
WHERE RowID <= 2 

2) आप यह भी अपने आप में

SELECT a1.* FROM Table1 AS a1 
    LEFT JOIN Table1 AS a2 
    ON a1.product = a2.product AND a1.amount<= a2.amount 
GROUP BY a1.product 
HAVING COUNT(*) <= 2; 
+0

mysql में विश्लेषणात्मक कार्य नहीं हैं। –

संबंधित मुद्दे