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

Posted

技术标签:

【中文标题】在 Oracle 中实现此逻辑的最有效方法【英文标题】:Most efficient way to implement this logic in Oracle 【发布时间】:2014-09-07 16:39:14 【问题描述】:

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

示例输入:

示例输出:

【问题讨论】:

为什么会收到重复的订单 ID?这就是你需要解决的问题。那么你就不需要实现那个奇怪的标签方案了。 嗯,你试过什么? 【参考方案1】:

“考虑到 ORDERS 表是 足够大"

嗯,首先我不会查询“足够大”表中的所有行。这就是 Nature 给我们 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
        )

【讨论】:

以上是关于在 Oracle 中实现此逻辑的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

检查数组是不是包含Java中的值的最有效方法? [复制]

鉴权操作流程(前端逻辑)

使用 Oracle SQL 在多个列上旋转多个组的最有效方法?

数据完整性问题查询修复逻辑oracle sql

Oracle 11g - 插入多行的最有效方式

如果存在则更新行否则使用实体框架插入逻辑[关闭]