我正在尝试实施一个简单的数据仓库分析查询,处理'YEAR_VALUE','MONTH_VALUE'和'INVOICE_COST'
SELECT YEAR_VALUE, MONTH_VALUE, SUM (INVOICE_VALUE) AS TOTAL_INVOICE,
RANK () OVER (PARTITION BY GROUPING_ID (YEAR_VALUE, MONTH_VALUE) ORDER BY SUM (INVOICE_VALUE) DESC) AS YEAR_RANK,
RANK () OVER (PARTITION BY YEAR_VALUE, GROUPING_ID (MONTH_VALUE) ORDER BY SUM (INVOICE_VALUE) DESC) AS MONTH_RANK
FROM FACT_WH
JOIN TIME_WH ON TIME_WH.TIME_ID = FACT_WH.TIME_ID
GROUP BY (YEAR_VALUE, MONTH_VALUE);
输出是: Output
'YEAR_RANK'应表示年度总发票金额与其他年份相比,2016年有YEAR_RANK = 1且2015年有YEAR_RANK = 2
问题是'YEAR_RANK'的值为1,2,3,4,5应该是1,1,2,2,1 我在代码中找不到问题,可能在第2行,我尝试了所有内容并浪费了很多时间。
提前致谢。
答案 0 :(得分:0)
一种好的方法,特别是在查询很复杂和/或提供令人困惑的结果的情况下,将整个查询划分为每个解决特定任务的子查询。
在您的情况下,我建议首先在YEAR和月份上攻击事实和维度表的连接以计算total_invoice
您可以获得
等结果YEAR_VALUE MONTH_VALUE TOTAL_INVIOCE
---------- ----------- -------------
2016 3 29960
2016 1 10700
2015 11 5100
2015 8 1680
2016 2 800
请注意,您不需要任何GROUP BY扩展名,例如GROUPING_ID,您将使用分析函数解决所有问题
在下一步(使用以前的结果作为因子子查询),使用[{1}}的分析版本计算年份和月份总数。
在最后一步中,您计算RANK。请注意,您需要的那一年 一个DENSE_RANK,否则你会被“跳过”等级,如1,3(由于重复记录一年)。
SUM
根本没有分区,year_rank
在YEAR分区,因为您在一年内订购月份。
month_rank