选择每年销售的十大产品

时间:2020-06-30 19:36:23

标签: sql oracle db2

我有两个表:

Sales
columns:  (Sales_id, Date , Customer_id, Product_id, Purchase_amount):
Product 
columns:  ( Product_id, Product_Name, Brand_id,Brand_name)

我必须写一个查询来查找每年销售的前十大产品。我现在的查询是:

WITH PH AS 
(SELECT P.Product_Name, LEFT(S.Date,4) "SYEAR", COUNT(S.Product_id) "Product Count" 
FROM Sales S LEFT JOIN Product P
ON S.Product_Id=P.Product_Id
GROUP BY P.Product_Name, LEFT(S.Date,4)

SELECT P.Product_Name, "SYEAR", "Product_Count"
FROM (SELECT P.Product_Name, "SYEAR", "Product_Count",
RANK OVER (PARTITION BY "SYEAR" ORDER BY "Product_Count" DESC) "TEMP"
)
WHERE "TEMP"<=10

这似乎不是最优化的查询。你能帮我吗?可以使用替代版本来获得所需的结果吗?

注释

  1. 重复代码的主要原因是可以按年份分组。给定表中没有年份字段。
  2. 日期格式为:YYYYMMDD(例如:20200630)

任何帮助将不胜感激。预先感谢

1 个答案:

答案 0 :(得分:2)

您可以将窗口函数与聚合结合起来

SELECT PY.*
FROM (SELECT P.Product_Name, LEFT(S.Date,4) AS YEAR, COUNT(*) AS CNT,
             RANK() OVER (PARTITION BY LEFT(S.Date, 4) ORDER BY COUNT(*) DESC) AS SEQNUM
      FROM Sales S LEFT JOIN
           Product P
           ON S.Product_Id = P.Product_Id
      GROUP BY P.Product_Name, LEFT(S.Date, 4)
     ) PY
WHERE SEQNUM <= 10;

从性能的角度来看,这可能会生成与查询非常相似的执行计划。但是,遵循起来更简单。

相关问题