在Oracle中实现此逻辑的最有效方法

时间:2014-09-07 16:39:14

标签: sql oracle performance query-optimization

问题如下。假设有两种类型的订单,即VE和VC订单(VE订单优先于VC订单)。有两种类型的优先级HIGH和LOW。每个订单都由ORDER_ID标识,然后用订单类型标记,最后是优先级。碰巧的是,随着时间的推移,订单可以改善其类型,优先级或两者,从而导致几个具有重复订单ID的新条目。任务是标记每个订单的优先级最高的状态为1,其余的为0。考虑到ORDERS表足够大并且在某些情况下某些行必须重新标记,您将如何尝试这样做。

示例输入:

enter image description here

示例输出:

enter image description here

1 个答案:

答案 0 :(得分:0)

  

"考虑到ORDERS表,您将如何尝试这样做?   足够大"

嗯,首先,我不会查询"足够大的所有行"表。这就是大自然给我们WHERE条款的原因。

因此,给定某种形式的过滤,剩下的逻辑是:

select order_id
       , order_type
       , priority
       , case when rn = 1 then 1 else 0 end as temp_label
 from
       (  select order_id
                 , order_type
                 , priority
                 , row_number() over ( partition by order_id
                                       order by decode(order_type, 'VE', 1, 2)
                                                , decode(priority, 'HIGH', 1, 2)
                                       ) as rn
           from your_table
           where whatever = 'BLAH' -- your criteria go here
        )