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
Ответ 2
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 скрипт на основе данных теста zane bien.
Ответ 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;