【问题标题】:How to SELECT top 10 products most sells?如何选择最畅销的前 10 种产品?
【发布时间】:2017-07-21 09:47:29
【问题描述】:

我有一个名为“items”的表,其中存储了每个订单中销售的每种产品的信息,但我想检索销售产品数量最多的前 10 个订单。我已经执行了一个 SELECT 语句来检索每个订单中售出的产品数量,但我不知道如何才能只检索前 10 个订单。谢谢。

SELECT   codigo_orden AS ORDER_ID, COUNT(codigo_producto) AS PRODUCTS_SOLD
FROM     cs_items
GROUP BY codigo_orden
ORDER BY 2 DESC;

但我只想检索 TOP 10 最畅销的产品!类似的东西:

【问题讨论】:

标签: sql oracle group-by sql-order-by


【解决方案1】:

如果您使用的是 Oracle 12c,则可以使用行限制子句,例如

SELECT   codigo_orden AS ORDER_ID, COUNT(codigo_producto) AS PRODUCTS_SOLD
FROM     cs_items
GROUP BY codigo_orden
ORDER BY 2 DESC
FETCH FIRST 10 ROWS ONLY

如果你没有使用12c,那么你可以使用一个窗口函数,例如

select order_id, products_sold
from (
    SELECT   codigo_orden AS ORDER_ID, 
             COUNT(codigo_producto) AS PRODUCTS_SOLD,
             rank() over (order by count(codigo_producto) ) as rnk
    FROM     cs_items
    GROUP BY codigo_orden
)
where rnk <= 10
order by products_sold

您可能需要使用 dense_rank() 与 rank(),具体取决于您要如何处理平局。

【讨论】:

  • 谢谢,但我使用的是 Oracle 11g。
  • @Rattlesnake。我根据您的评论扩展了我的答案。
  • 从OP对后续问题的回答以及他提供的示例来看,他似乎需要row_number()而不是rank()dense_rank()
【解决方案2】:

尝试以下方法:

select ORDER_ID, PRODUCTS_SOLD
from (
SELECT   codigo_orden AS ORDER_ID, COUNT(codigo_producto) AS PRODUCTS_SOLD
FROM     cs_items
GROUP BY codigo_orden
ORDER BY 2 DESC)
WHERE ROWNUM <= 10;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多