我需要使用以下规则将两个不同的列分组:
如果将订单拆分为多个容器,则所有这些容器必须在同一组中
如果任何分组的容器具有多个订单,则每个订单都需要在同一组中处理(如结果中的C组)。如果发生这种情况,并且订单属于另一个组,则需要合并这些组。这可能会导致大型连锁店...
每个其他容器都可以单独处理,并且不属于一个组
我有以下数据:
我的目的是创建一个视图,该视图应返回以下结果:
答案 0 :(得分:0)
这是一个遍历图的问题。您需要遍历链接容器的图表,才能将所有可能的容器链接到订单。
然后我的解决方案是聚合以获取最小值,然后使用dense_rank()
来分配分组。
with cte as (
select orderid, containerid, containerid as linked_containerid,
cast(',' + convert(varchar(max), containerid), ',') as containers
from t
union all
select cte.orderid, cte.containerid, t.containerid,
cte.containers + convert(varchar(max), t.containerid) + ','
from cte join
t
on cte.containerid = t.containerid and
cte.containerid not like '%,' + convert(varchar(max), t.containerid) + ',%'
)
select cte.orderid, cte.containerid,
dense_rank(min(cte.linked_container)) over () as grouping
from cte
group by cte.orderid, cte.containerid;