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

Client Product
1 A
1 B
1 C
2 A
2 B
2 D
3 A
3 B

如何编写查询以在AWS 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组合的查询,但要获得另一个组合,我需要更改De Filters(WHERE)并运行N次.如果我有数百种组合,这是不可行的.

推荐答案

您可以try 使用combinations函数,如果它在Athena中可用(它存在于Athena所基于的Trino中):

WITH dataset (Client, Product) AS (
    values (1,  'A'),
    (1, 'B'),
    (1, 'C'),
    (2, 'A'),
    (2, 'B'),
    (2, 'D'),
    (3, 'A'),
    (3, 'B')
)


select p.comb, count(Client) count
from (select comb
      from (select array_distinct(array_agg(Product)) arr
            from dataset) p,
           unnest(combinations(arr, 2) || combinations(arr, 3)) as t(comb)) p -- build all product combinations
left join (select client, comb
           from (select client, array_distinct(array_agg(Product)) as arr
                 from dataset
                 group by client),
                unnest(combinations(arr, 2) || combinations(arr, 3)) as t(comb)) cp -- build all product combinations for concrete client 
          on cp.comb = p.comb
group by p.comb
order by cardinality(p.comb), p.comb;

输出:

comb count
[A, B] 3
[A, C] 1
[A, D] 1
[B, C] 1
[B, D] 1
[C, D] 0
[A, B, C] 1
[A, B, D] 1
[A, C, D] 0
[B, C, D] 0

请注意,组合在输出中仅限于100000条记录,因此如果产品组合的实际数量较高,这将不起作用(另外,无论哪种方式,对于任何数量相对较大的产品,这都将是相当昂贵的查询).

Sql相关问答推荐

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

我如何计算字母a出现的字符串的次数?

使用`lag()`获取上一个时间戳

Access 365将文本转换回BigInt

如何根据给定条件PostgreSQL迭代减少组中的行数

Oracle PL/SQL:解决DBMS输出大小限制的问题

将伪数据插入Postgres表

显示十进制列,但尽可能显示为整数

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

如何修复初学者 SQL INNER JOIN 查询错误

计算不同模式的时间跨度

如何在Hive SQL中分别按多列进行分组?

如何向 mariadb 添加外键?

用替代方案替换 SQL Cursor 以提高性能

PostgreSQL:从多个字段收集特定指标的最后一个条目

Postgresql 具有相似行为和模式行为的问题

为重复的项目编号显示正在处理

SQL - 只需要 GROUP BY SELECT 的一列

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

如何在 Oracle 中获取此变量的值?