首页 > 解决方案 > SQL Server:列的链式分组

问题描述

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

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

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

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

我有以下数据:

在此处输入图像描述

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

在此处输入图像描述

标签: sqlsql-serverviewsql-server-2014

解决方案


这是一个图行走问题。您需要遍历链接容器的图表以获取所有可能链接到订单的容器。

然后我的解决方案是聚合以获得最小值并用于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;

推荐阅读