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)