我刚创建了一个包含以下详细信息的小型数据仓库。
事实表
尺寸
我想查询哪个产品按月销售最多,我的意思是输出就像
Month - Product Code - Num_Of_Items
JAN xxxx xxxxx
FEB xxxx xxxxx
我尝试了以下查询
with product_sales as(
SELECT dd.month,
fs.p_id,
dp.title,
SUM(number_of_items) Num
FROM fact_sales fs
INNER JOIN dim_products dp
ON fs.p_id = dp.p_id
INNER JOIN dim_date dd
ON dd.date_id = fs.date_id
GROUP BY dd.month,
fs.p_id,
dp.title
)
select distinct month,movie_id,max(num)
from product_sales
group by movie_id,title, month;
而不是最多12行,我有132条记录。我需要这方面的指导。感谢。
答案 0 :(得分:2)
您的查询有一些没有意义的事情,例如:
movie_id
来自哪里?from abc
?它应该是from product_sales
吗?也就是说,如果您需要按月进行最大产品销售,并且需要包含产品代码(或电影ID或其他),则需要进行分析查询。你的会是这样的:
WITH product_sales AS (
SELECT
dd.month,
fs.p_id,
dp.title,
SUM(number_of_items) Num,
RANK() OVER (PARTITION BY dd.month ORDER BY SUM(number_of_items) DESC) NumRank
FROM fact_sales fs
INNER JOIN dim_products dp ON fs.p_id = dp.p_id
INNER JOIN dim_date dd ON dd.date_id = fs.date_id
GROUP BY dd.month, fs.p_id, dp.title
)
SELECT month, p_id, title, num
FROM product_sales
WHERE NumRank = 1
请注意,如果任何月份的最高销售额达到平局,此查询将显示该月的所有最高销售额。换句话说,如果1月份产品代码AAAA
和BBBB
与最高销售额相关联,则两种产品的查询结果都会有1月份的行。
如果您希望每月只有一行,即使有平局,请使用ROW_NUMBER
代替RANK()
,但请注意ROW_NUMBER
将随意挑选一名获胜者,除非您定义了平局 - 断路器。例如,要让最低p_id
成为决胜局,请像这样定义NumRank
列:
ROW_NUMBER() OVER (
PARTITION BY dd.month
ORDER BY SUM(number_of_items) DESC, p_id
) NumRank
答案 1 :(得分:1)
您可以使用MAX()KEEP(DENSE_RANK FIRST ORDER BY)来选择最大值为num
的movie_id...
select
month,
MAX(movie_id) KEEP (DENSE_RANK FIRST order by num desc) as movie_id,
MAX(num)
from
abc
group by month
;