问题描述
我有大量的订单 (200),涉及大约2000种不同的产品,需要将6个订单分批分组。
任务是确定最佳的订单组,以便可以最大化性能 (人力性能)。
首先,我有一个脚本在OE模式上工作。
该脚本可以轻松地识别出具有最大熟悉度的前两个订单。
由于产生交叉联接的查询非常昂贵,因此我需要尽可能地重用。
Foling步骤将是计算累积订单对的最佳匹配顺序。
是否有使用循环的方式来管理这样的任务。
另一种解决方案是为每个订单构建位图,并使用位图和/或xor函数计算匹配因子。我不知道我是否可以在数据库中做类似的事情,但是我想这是数据库确实知道如何使用位图索引的事情。
你能帮忙吗?
因此,为了使事情更清楚,我将订单数量限制为4个,将产品限制为12个左右。
从结果 (最后一次qurey) 中可以看出,订单2439和2391
是最好的人选,因为他们有3个共同的产品,最多4个
2439 2391 4 7 3
显然,其他两个没有共同之处,是一个非常糟糕的多,但有这么少的订单,这是预期的。
这个想法是对一系列的订单和产品做同样的事情。
随着问题变得越来越复杂,它变得越来越难以处理。
我的想法是为每个订单构建一个位图 (缺少图像),然后使用逻辑函数尝试计算匹配因子。
或者运行循环查询,直到我构建所需数量的匹配订单 (例如6)。
还是不可读?
任务是确定最佳的订单组,以便可以最大化性能 (人力性能)。
首先,我有一个脚本在OE模式上工作。
该脚本可以轻松地识别出具有最大熟悉度的前两个订单。
由于产生交叉联接的查询非常昂贵,因此我需要尽可能地重用。
Foling步骤将是计算累积订单对的最佳匹配顺序。
是否有使用循环的方式来管理这样的任务。
另一种解决方案是为每个订单构建位图,并使用位图和/或xor函数计算匹配因子。我不知道我是否可以在数据库中做类似的事情,但是我想这是数据库确实知道如何使用位图索引的事情。
你能帮忙吗?
因此,为了使事情更清楚,我将订单数量限制为4个,将产品限制为12个左右。
从结果 (最后一次qurey) 中可以看出,订单2439和2391
是最好的人选,因为他们有3个共同的产品,最多4个
2439 2391 4 7 3
显然,其他两个没有共同之处,是一个非常糟糕的多,但有这么少的订单,这是预期的。
这个想法是对一系列的订单和产品做同样的事情。
随着问题变得越来越复杂,它变得越来越难以处理。
我的想法是为每个订单构建一个位图 (缺少图像),然后使用逻辑函数尝试计算匹配因子。
或者运行循环查询,直到我构建所需数量的匹配订单 (例如6)。
还是不可读?
专家解答
我不清楚你到底想做什么。您是否正在尝试找到具有最多共同产品的订单并将其组合在一起?
在这种情况下,以下内容可能会有所帮助:
-将每个订单的产品加载到嵌套表中
-使用multisset intersect查找具有常见产品的
这看起来像:
但这仍然只是一个起点。您需要根据需要对这些结果进行分组/过滤。它可能需要使用递归与在纯SQL中做到这一点。
精确定义算法应该如何工作将帮助我们让您更接近一个完整的解决方案。
在这种情况下,以下内容可能会有所帮助:
-将每个订单的产品加载到嵌套表中
-使用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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




