2012-07-10 42 views
10

Dưới đây là BảngSQL chọn nhóm truy vấn

tôi 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 | 
+--------+----------+---------+ 

Bây giờ tôi muốn hiển thị hai số tiền cao nhất cho mỗi sản phẩm ...

Vì vậy, tôi muốn xây dựng truy vấn SQL đơn cho tôi kết quả như sau ..

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

Vui lòng giúp tôi xây dựng truy vấn như vậy ..

Trả lời

10

Bạn có thể sử dụng giải pháp này để lấy "nhóm khôn ngoan tối đa" dựa trên 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 

Đơn giản chỉ cần thay đổi 2 để tuy nhiên nhiều đầu hàng bạn muốn lấy mỗi sản phẩm.

Nếu bạn muốn truy xuất hai hàng thấp nhất cho mỗi sản phẩm, bạn chỉ cần thay đổi dấu hiệu <= trong INNER JOIN thành >=.

Bạn có thể fiddle xung quanh với giải pháp này ở đây: 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

câu trả lời không phải là chung. Nếu bạn có 100 sản phẩm thì sao? –

0

Bạn có thể làm điều đó trong hai cách: 1) Thêm cột Row Index sẽ phản ánh trình tự, sau đó chọn tất cả các hàng với Row < = 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) Bạn cũng có thể tham gia bảng để bản thân

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 không có chức năng phân tích. –

1
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 
ORDER BY a.amount desc 

Vui lòng tham khảo http://sqlfiddle.com/#!2/9ba82/1

Các vấn đề liên quan