选择每年销售的前10个产品

tpxzln5u  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(196)

我有两张table:

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

这似乎不是最优化的查询。你能帮我一下吗?能否有一个替代版本来获得所需的结果?
笔记
代码重复的主要原因是允许按年份分组。给定表中没有年度字段。
日期格式为:yyyymmdd(例如:20200630)
任何帮助都将不胜感激。提前谢谢

ekqde3dh

ekqde3dh1#

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

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;

从性能Angular 来看,这可能会生成一个与查询非常相似的执行计划。不过,这更简单。

相关问题