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

时间:2017-10-31 08:18:34

标签: sql r sqlite recursion sqldf

我的数据集如下:

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是产品D,最终产品A也是与产品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因此我想到使用包sqldf的递归CTE。 这是一个很大的数据,因此使用矩阵解决问题会让我超过1.3 TB,这是我所不具备的。 有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

此关系为commutative,因此b计算两个方向的关系,以使以下查询更简单。

closure是递归CTE,并计算transitive closure,即所有可能的等效产品组合。

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

A|A
B|A
C|A
D|A
E|E
Z|Z

g通过计算有多少较小的class个不同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); 值来计算群组编号:

A|1
B|1
C|1
D|1
E|2
Z|3
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
  

它的大数据

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