Позвольте мне рассказать вам пример моей проблемы. Например, у нас есть таблица с именем order
где мы вставляем все заказы и покупки.
Таблица А (orders
):
+--------------------------+
| CustomerKey | ProductKey |
+--------------------------+
| 306545 | pro1 |
| 597864 | pro3 |
| 784678 | pro2 |
| 905479 | pro3 |
| 306545 | pro1 |
| 348965 | pro3 |
| 784678 | pro3 |
+--------------------------+
Теперь я хотел бы заказать и получить наши самые продаваемые продукты и, например, получить звание pro3 в списке самых продаваемых продуктов.
Вывод запроса:
+-------------------------------+
| id | ProductKey | numberSold |
+-------------------------------+
| 1 | pro3 | 4 |
| 2 | pro1 | 2 |
| 3 | pro2 | 1 |
+-------------------------------+
Я написал этот запрос:
select ProductKey,
count(1) as numberSold
from A group
by ProductKey
order by count(1) desc
Результат не полезен для меня. Например, мне нужно получить pro27 в рейтинге самых продаваемых продуктов (у нас 100 000 продуктов!)
+-------------------------------------+
| id | ProductKey | numberSold | rank |
+-------------------------------------|
| 1 | pro3 | 4 | 1 |
| 2 | pro1 | 2 | 2 |
| 3 | pro2 | 1 | 3 |
+------------------------------+------+
Вы можете использовать производную таблицу для решения этой проблемы. В любом случае запрос будет медленным, но он даст вам желаемый результат.
SET @rank = 0;
SELECT *
FROM
(
select (@rank := @rank + 1) AS Rank,
ProductKey,
count(1) as numberSold
from A
group by ProductKey
order by count(1) desc
) dt
WHERE dt.ProductKey = 'prod27';
Других решений пока нет …