presto sql中的笛卡尔乘积无界组数

presto sql中的笛卡尔乘积无界组数,sql,presto,cartesian-product,trino,Sql,Presto,Cartesian Product,Trino,给我一张像这样的桌子 Key | Value ----------------+------------- A | 1 A | 2 B | 1 B | 2 C | 1 C | 2 如何使用SQL生成所有键和值的乘积 这是所需的输出: Group | Key | Value

给我一张像这样的桌子

     Key        |   Value
----------------+-------------
 A              | 1
 A              | 2
 B              | 1
 B              | 2
 C              | 1
 C              | 2
如何使用SQL生成所有键和值的乘积

这是所需的输出:

   Group |   Key        |   Value
---------+--------------+----
 1       |A             | 1
 1       |B             | 1
 1       |C             | 1
 2       |A             | 1
 2       |B             | 1
 2       |C             | 2
 3       |A             | 1
 3       |B             | 2
 3       |C             | 1
 4       |A             | 1
 4       |B             | 2
 4       |C             | 2
 5       |A             | 2
 5       |B             | 2
 5       |C             | 2
 6       |A             | 2
 6       |B             | 1
 6       |C             | 2
 7       |A             | 2
 7       |B             | 2
 7       |C             | 1
 8       |A             | 2
 8       |B             | 1
 8       |C             | 1

为了说明目的,我可以在Python中使用:

In[1]:来自itertools进口产品 在[2]中:列表产品[A',1',A',2],“B',1',B',2],“C',1',C',2] 出[2]: [A',1',B',1',C',1, 'A',1',B',1',C',2, 'A',1',B',2',C',1, 'A',1',B',2',C',2, 'A',2',B',1',C',1, 'A',2',B',1',C',2, 'A',2',B',2',C',1, 'A',2',B',2',C',2]
在我的实际应用程序中,键、值对的数量不是预先固定的。

可以使用递归CTE实现这一点,但将值放在单个列中更简单:

with recursive kv as (
      select key, value, dense_rank() over (order by key) as seqnum
      from t
     ),
     cte(kv, seqnum) as (
      select array[row(key, value)] as kv, 1 as seqnum
      from kv
      where seqnum = 1
      union all
      select kv || row(kv.key, kv.value), kv.seqnum
      from cte join
           kv
           on kv.seqnum = kv + 1      
     )
select cte.*, row_number() over (order by seqnum)
from cte;
如果愿意,可以取消数组的嵌套以获得单独的行


不幸的是,我手头没有Presto/Trino来检查语法。

没有直接的方法来完成您的要求,但这里有一种可能的方法:

使用tkey,值为 价值观 “A”,1, "A",2,, “B”,1, “B”,2, "C",1,, “C”,2 , 分组为 选择 组合array_aggROWkey,值,3个组合, countdistinct键\u计数 从t , 组合为 选择上面的行号作为组、组合 从分组交叉连接UNNESTCombination作为ucombination 其中cardinalityarray\u distincttransformcombination,e->e[1]=键计数 , 不被视为 选择组、键、值 从组合中,取消组合为ukey,值 按组、键排序 从未列出的列表中选择* =>

下面是它的工作原理:

创建一个条目数组,即ROWkey、value,并计算所有不同键的数量 使用函数从该数组的元素生成所有可能的3向组合。这将产生一些无效的组合:那些多次包含同一个键的组合。 过滤生成的组合以排除不包含所有键的任何组合。使用“行编号”窗口功能为每个剩余组合分配组id。 从组合数组中取消单个键/值对的测试,以生成预期的输出。
您使用的是什么版本的Presto?钥匙数量是否固定?Trino于2020年8月8日发布340。键的数量不是固定的,每个键的值的数量固定为10。在recursive with query hmmm中,由于Presto缺少列别名而出现错误。因此在我的设置中,键的数量没有限制。因此,我不确定组合是否可以使用它,您希望有多少个键?小于15,并且值也小于15btw,递归CTE在这种情况下会有帮助吗?理论上,是的,但Trino中的递归CTE目前效率不高,并且有一系列限制。
 group | key | value
-------+-----+-------
     1 | A   |     1
     1 | B   |     1
     1 | C   |     1
     2 | A   |     1
     2 | B   |     2
     2 | C   |     1
     3 | A   |     2
     3 | B   |     1
     3 | C   |     1
     4 | A   |     2
     4 | B   |     2
     4 | C   |     1
     5 | A   |     1
     5 | B   |     1
     5 | C   |     2
     6 | A   |     1
     6 | B   |     2
     6 | C   |     2
     7 | A   |     2
     7 | B   |     1
     7 | C   |     2
     8 | A   |     2
     8 | B   |     2
     8 | C   |     2
(24 rows)