递归 CTE 以唯一编号数据集中的组
Recursive CTE to uniquely number groups in data set
我的数据集如下:
Product_1 Product_2
A B
A A
A C
C D
B C
E E
Z Z
table说的是实际上A产品是B产品那么A产品当然是A产品,A产品也和C产品一样但是考虑到C产品是D产品最终产品 A 也与产品 D 相同。
我需要在此 table 添加一列,将所有相同的产品分组如下:
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,而我没有。
有人知道怎么做吗?
此关系是 commutative,因此 b
计算两个方向的关系以使以下查询更简单。
closure
是递归 CTE,计算 transitive closure,即等效产品的所有可能组合。
ec
计算equivalence classes,即对于每个产品,它计算相同class中最小的产品名称,例如:
A|A
B|A
C|A
D|A
E|E
Z|Z
g
通过计算有多少个较小的不同 class
值来计算组数:
A|1
B|1
C|1
D|1
E|2
Z|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);
It's big data
那么希望你有一个大磁盘来存放临时数据……
我的数据集如下:
Product_1 Product_2
A B
A A
A C
C D
B C
E E
Z Z
table说的是实际上A产品是B产品那么A产品当然是A产品,A产品也和C产品一样但是考虑到C产品是D产品最终产品 A 也与产品 D 相同。
我需要在此 table 添加一列,将所有相同的产品分组如下:
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,而我没有。 有人知道怎么做吗?
此关系是 commutative,因此 b
计算两个方向的关系以使以下查询更简单。
closure
是递归 CTE,计算 transitive closure,即等效产品的所有可能组合。
ec
计算equivalence classes,即对于每个产品,它计算相同class中最小的产品名称,例如:
A|A B|A C|A D|A E|E Z|Z
g
通过计算有多少个较小的不同 class
值来计算组数:
A|1 B|1 C|1 D|1 E|2 Z|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);
It's big data
那么希望你有一个大磁盘来存放临时数据……