如何用SQL组合客户已有的产品

问题描述 投票:0回答:1

我有一个表,其中包含许多行,其中包含客户和他们拥有的产品。 是这样的:

客户 产品
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 次。如果我有数百种组合,这是不可行的。

sql amazon-athena
1个回答
0
投票

根据您提供的信息,我了解到您希望在 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 生成未知数量产品的所有组合。

© www.soinside.com 2019 - 2024. All rights reserved.