暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 复杂查询

ASKTOM 2019-12-06
313

问题描述

我有大量的订单 (200),涉及大约2000种不同的产品,需要将6个订单分批分组。
任务是确定最佳的订单组,以便可以最大化性能 (人力性能)。

首先,我有一个脚本在OE模式上工作。

该脚本可以轻松地识别出具有最大熟悉度的前两个订单。

由于产生交叉联接的查询非常昂贵,因此我需要尽可能地重用。

Foling步骤将是计算累积订单对的最佳匹配顺序。


是否有使用循环的方式来管理这样的任务。

另一种解决方案是为每个订单构建位图,并使用位图和/或xor函数计算匹配因子。我不知道我是否可以在数据库中做类似的事情,但是我想这是数据库确实知道如何使用位图索引的事情。

你能帮忙吗?

因此,为了使事情更清楚,我将订单数量限制为4个,将产品限制为12个左右。

从结果 (最后一次qurey) 中可以看出,订单2439和2391
是最好的人选,因为他们有3个共同的产品,最多4个
2439 2391 4 7 3

显然,其他两个没有共同之处,是一个非常糟糕的多,但有这么少的订单,这是预期的。

这个想法是对一系列的订单和产品做同样的事情。

随着问题变得越来越复杂,它变得越来越难以处理。

我的想法是为每个订单构建一个位图 (缺少图像),然后使用逻辑函数尝试计算匹配因子。

或者运行循环查询,直到我构建所需数量的匹配订单 (例如6)。

还是不可读?




专家解答

我不清楚你到底想做什么。您是否正在尝试找到具有最多共同产品的订单并将其组合在一起?

在这种情况下,以下内容可能会有所帮助:

-将每个订单的产品加载到嵌套表中
-使用multisset intersect查找具有常见产品的

这看起来像:

create or replace type numbers_nt 
  is table of number(6);
/

with ords as (
  select oi.order_id, cast ( collect ( product_id ) as numbers_nt ) items
  from   oe.order_items oi
  group  by oi.order_id
), intersects as (
  select o1.order_id o1id, o2.order_id o2id,
         cardinality ( o1.items ) o1_item#,
         cardinality ( o2.items ) o2_item#,
         ( o1.items multiset intersect o2.items ) mset
  from   ords o1
  join   ords o2
  on     o1.order_id > o2.order_id
  and    ( o1.items multiset intersect o2.items ) is not empty
)
  select o1id,
         max ( o2id ) keep (
           dense_rank first 
           order by cardinality ( mset ) desc
         ) o2id,
         max ( cardinality ( mset ) ) card
  from   intersects i
  group  by o1id
  order  by card desc;

O1ID     O2ID      CARD   
   2380    2375       9 
   2399    2365       8 
   2422    2380       8 
   2382    2354       8 
   2429    2382       7 
   2412    2382       7 
   2420    2382       7 
   2419    2354       7 
   2362    2361       7 
   2392    2375       7
...


但这仍然只是一个起点。您需要根据需要对这些结果进行分组/过滤。它可能需要使用递归与在纯SQL中做到这一点。

精确定义算法应该如何工作将帮助我们让您更接近一个完整的解决方案。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论