递归 CTE 到数据集中唯一编号的组



我的数据集如下:

Product_1   Product_2
   A           B
   A           A
   A           C
   C           D
   B           C
   E           E
   Z           Z
该表所说的是,产品A实际上是产品B,然后产品A当然是产品A,产品A也与产品C相同

,但考虑到产品C是最终产品A中的产品D也与产品D相同。

我需要在此表中添加一列,将所有相同的产品分组如下:

Product_1   Product_2  Group
   A           B         1
   A           A         1
   A           C         1
   C           D         1
   B           C         1
   E           E         2
   Z           Z         3

正在使用 R,因此我正在考虑将递归 CTE 与包 sqldf 一起使用。这是大数据,所以使用矩阵来解决问题会把我推到我没有的 1.3 TB 以上。有谁知道该怎么做?

这种关系是可交换的,因此b计算两个方向的关系以使以下查询更简单。

closure是递归CTE,并计算传递闭包,即等效积的所有可能组合。

ec计算等价类,即对于每个产品,它计算同一类中最小的产品名称,例如:

A|一个B|一个C|AD|AE|EZ|Z

g通过计算有多少个较小的非重复class值来计算组号:

A|1B|1C|1D|1E|2Z|3
WITH RECURSIVE b AS (
  SELECT product_1, product_2 FROM MyTable
  UNION ALL
  SELECT product_2, product_1 FROM MyTable
),
closure AS (
  SELECT product_1, product_2 FROM b
  UNION
  SELECT c.product_1, b.product_2
  FROM closure AS c
  JOIN b ON c.product_2 = b.product_1
),
ec(product, class) AS (
  SELECT product_1, MIN(product_2)
  FROM closure
  GROUP BY product_1
),
g(product, g) AS (
  SELECT product,
         (SELECT COUNT(DISTINCT class)
          FROM ec AS ec2
          WHERE ec2.class <= ec.class)
  FROM ec
)
UPDATE MyTable
SET "Group" = (SELECT g
               FROM g
               WHERE product = MyTable.Product_1);

这是大数据

然后让我们希望您有一个用于临时数据的大磁盘......

最新更新