SQL Server:列的链分组

时间:2019-01-07 15:43:27

标签: sql sql-server view sql-server-2014

我需要使用以下规则将两个不同的列分组:

  1. 如果将订单拆分为多个容器,则所有这些容器必须在同一组中

  2. 如果任何分组的容器具有多个订单,则每个订单都需要在同一组中处理(如结果中的C组)。如果发生这种情况,并且订单属于另一个组,则需要合并这些组。这可能会导致大型连锁店...

  3. 每个其他容器都可以单独处理,并且不属于一个组

我有以下数据:

enter image description here

我的目的是创建一个视图,该视图应返回以下结果:

enter image description here

1 个答案:

答案 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;