让我告诉你一个我遇到的问题的例子。例如,我们有一个名为order
的表,我们在其中插入所有订单和购买。
表A(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 |
+------------------------------+------+
答案 0 :(得分:1)
您可以使用派生表来解决此问题。无论如何,查询会很慢,但它会为您提供所需的结果。
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';