SQL select group query

Ниже моя таблица

Таблица 1

+--------+----------+---------+  
| 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    |   
+--------+----------+---------+  

Пожалуйста, помогите мне построить такой запрос.

Ответ 1

Вы можете использовать это решение для получения "группового максимума" на основе 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

Ответ 3

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

Обратитесь к http://sqlfiddle.com/#!2/9ba82/1

Ответ 4

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

Ответ 5

Вы можете сделать это двумя способами: 1) Добавьте столбец индекса строки, который будет отображать порядок, а затем выберите все строки с 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) Вы также можете присоединиться к таблице для себя

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;