如何在Oracle中的一列中选择多个列没有重复项

问题描述:

问题: 我需要找到供应商的顶级客户端。 顶级客户拥有所有订单上的最大项目总和。 如果供应商有2个顶级客户,那么顶级客户将使用最小订单ID,这意味着 - 谁先创建订单并获得最大物品 - 将成为顶级客户。 我在写这个SQL代码:如何在Oracle中的一列中选择多个列没有重复项

select s.s_id, c.c_id, min(o.o_id), count(*) 
from suppliers s, clients c, orders o, items i 
where s.s_id=c.id_s and c.c_id=o.id_c and o.o_id=i.id_o 
group by s.s_id, c.c_id 
order by 4 desc, 3 

,并得到这样的结果:http://imageshack.us/photo/my-images/148/32969388.jpg/

,但我需要得到:http://imageshack.us/photo/my-images/842/51815927.jpg/

您需要排名顺序计数和ID。所以你应该使用分析和内联视图。例如:

select s_id 
     , c_id 
     , min_order_id 
     , no_of_orders 
from (
    select s_id 
      , c_id 
      , min_order_id 
      , no_of_orders 
      , rank() over (partition by s_id 
          order by no_of_orders DESC, min_order_id ASC) rnk 
    from (
     select s.s_id 
       , c.c_id 
       , min(o.o_id) as min_order_id 
       , count(*) as no_of_orders 
     from suppliers s, clients c, orders o, items i 
     where s.s_id=c.id_s and c.c_id=o.id_c and o.o_id=i.id_o 
     group by s.s_id, c.c_id 
     ) 
    )  
where rnk=1 
/
+0

对不起,你的SQL代码得到这个:http://imageshack.us/photo/my-images/98/23702547.jpg/谢谢你的帮助。 – user963601

+0

所有行的排名均为1 – user963601

+0

排名仅适用于每个供应商分区(而不是供应商,客户端分区)。我已经编辑了APC的查询。 –