我正在使用下面的Oracle代码来查找销售量最大的前5家商店。这5个存储库之后的所有内容都应归为一个“其他”存储桶等级6。Run_id和censage_ID具有一对一的关系。当只有一个run_id和一个case_id时,此代码有效。当我只有一个run_id和一个case_id时,此代码非常有用。但是,为了提高效率,我只希望在查询时才将每种情况的前5名提升到最高。当我这样做时,第一个run_id将显示前5个链条以及所有其他存储桶,之后的每个run_id仅显示排名为6的所有其他存储桶。
SELECT c.SCENARIO_ID, case when C.YEAR_MONTH_NBR >= to_char(r.proj_start_dt,'YYYYMM') then 'G' else 'L' End as overUnd, case when rnk <= 5 then c.model_nme else 'Other' end as Chain_Nme, sum(c.item_qty), case when rnk <= 5 then rnk else 6 end as final_rank
from USR.pdr_summary c
Left Outer Join run_tbl r on c.run_id = r.run_id
Left join (SELECT c.scenario_id, c.model_nme, rank () over (order by c.scenario_id, sum(C.item_qty) desc) as Rnk
from USR.pdr_summary c
where c.run_id IN ('1110','1111','1112','1113')
and c.scenario_id IN('5423','5424','5425','5426')
and c.model_nme <> 'Other Retail'
group by c.scenario_id, c.model_nme) rank_data
on rank_data.model_nme = c.model_nme
and rank_data.scenario_id = c.scenario_id
where c.run_id IN ('1110','1111','1112','1113')
and c.scenario_id IN('5423','5424','5425','5426')
group by c.SCENARIO_ID, case when C.YEAR_MONTH_NBR >= to_char(r.proj_start_dt,'YYYYMM') then 'G' else 'L' End, case when rnk <= 5 then c.model_nme else 'Other' end, case when rnk <= 5 then rnk else 6 end
order by c.SCENARIO_ID, overUnd, case when rnk <= 5 then rnk else 6 end asc
当我从排名数据查询中删除and rank_data.scenario_id = c.scenario_id
行时,在某些情况下,我将获得所有6个排名,而在其他情况下,我将获得排名1、3、5和6或1,2,4和6
我认为这与我进行联接的方式有关,但是我不知道为什么吗?
我想要的结果如下:
Scenario_id OverUnd Chain_nme item_qty rank
5423 G Walmart 1000 1
5423 G Amazon 950 2
5423 G Target 750 3
5423 G Walgreens 600 4
5423 G CVS 500 5
5423 G Other 800 6
5423 L Trader Joe 1000 1
5423 L Amazon 950 2
5423 L Target 750 3
5423 L Walgreens 600 4
5423 L Walmart 500 5
5423 L Other 800 6
5424 G Walgreens 1000 1
5424 G Amazon 950 2
5424 G Target 750 3
5424 G Walmart 600 4
5424 G CVS 500 5
5424 G Other 800 6
5424 L Trader Joe 1000 1
5424 L Amazon 950 2
5424 L Target 750 3
5424 L Walgreens 600 4
5424 L Walmart 500 5
5424 L Other 800 6
我得到的是:
Scenario_id OverUnd Chain_nme item_qty rank
5423 G Walmart 1000 1
5423 G Amazon 950 2
5423 G Target 750 3
5423 G Walgreens 600 4
5423 G CVS 500 5
5423 G Other 800 6
5423 L Trader Joe 1000 1
5423 L Amazon 950 2
5423 L Target 750 3
5423 L Walgreens 600 4
5423 L Walmart 500 5
5423 L Other 800 6
5424 G Other 700 6
5424 L Other 900 6
5425 G Other 700 6
5425 L Other 900 6
5426 G Other 700 6
5426 L Other 900 6
对不起,我不确定在复制/粘贴数据时如何使其看起来像表格。
答案 0 :(得分:0)
有人通过电子邮件将我的问题的答案发送给我。我需要按case_id和item_qty进行排名。
(partition by c.scenario_id order by c.scenario_id, sum(C.item_qty) desc) as Rnk