我有一个表,其中包含许多行,其中包含客户和他们拥有的产品。 是这样的:
客户 | 产品 |
---|---|
1 | A |
1 | B |
1 | C |
2 | A |
2 | B |
2 | D |
3 | A |
3 | B |
如何编写查询以在 AWS Athena 中获取结果? Athena 不支持程序。
这里,我们有以下组合:
AB: 3 cases(clients 1, 2, 3)
AC: 1 case (client 1)
AD: 1 case (client 2)
BC: 1 case (client 1)
BD: 1 case(client 2)
CD: 0 cases
ABC: 1 cases (client 1)
ABD: 1 case (client 2)
我有一个查询可以获取 AB 的组合,但要获取另一个,我需要更改过滤器(WHERE)并运行 N 次。如果我有数百种组合,这是不可行的。
根据您提供的信息,我了解到您希望在 Amazon Athena 中计算每个客户的所有可能的产品组合。这是一个组合问题,可以使用自连接来解决。然而,对于大量独特的产品来说,这种解决方案的计算成本很高,因为自连接的数量会随着您想要组合的产品数量呈指数级增长。
对于 2 个产品:
WITH combinations_2 AS (
SELECT a.client AS client,
a.product AS product1,
b.product AS product2
FROM your_table_name a
JOIN your_table_name b
ON a.client = b.client
WHERE a.product < b.product
)
SELECT product1, product2, COUNT(DISTINCT client) AS num_clients
FROM combinations_2
GROUP BY product1, product2;
对于 3 种产品:
WITH combinations_3 AS (
SELECT a.client AS client,
a.product AS product1,
b.product AS product2,
c.product AS product3
FROM your_table_name a
JOIN your_table_name b
ON a.client = b.client
JOIN your_table_name c
ON a.client = c.client
WHERE a.product < b.product
AND b.product < c.product
)
SELECT product1, product2, product3, COUNT(DISTINCT client) AS num_clients
FROM combinations_3
GROUP BY product1, product2, product3;
AWS Athena 不支持存储过程或用户定义函数来处理递归或循环,表达任意大小的组合非常具有挑战性。没有简单、有效的方法来使用纯 SQL 生成未知数量产品的所有组合。