我有一张这样的table:
group val1 val2 val3
group1 5 . .
group1 . 2 1
group1 . . 3
group2 1 4 .
group2 . . 8
group2 2 . 7
我需要使用空值(.)作为通配符,计算配置单元中每个组的所有可能组合的出现次数。这会给我这样的结果:
group val1 val2 val3 cnt
group1 5 2 1 2
group1 5 2 3 2
group2 1 4 8 2
group2 2 4 8 1
group2 2 4 7 1
我知道我可以通过选择所有不同的group-val1对,用所有不同的group-val2对完全连接这个,用所有不同的group-val3对完全连接这个。这为每个组提供了所有可能的组合,然后我可以将这些组合与我的表进行内部联接,计算原始数据行是组合子集的情况。
像这样:
create table my_results as
with combos as (
select *
from (select distinct group, val1 from data) A
full join (select distinct group, val2 from data) B
on A.group = B.group
full join (select distinct group, val3 from data) C
on A.group = C.group
)
select A.group, A.val1, A.val2, A.val3, count(*)
from combos A
inner join data B
on A.group = B.group
and (A.val1 = B.val1 OR B.val1 is null)
and (A.val2 = B.val2 OR B.val2 is null)
and (A.val3 = B.val3 OR B.val3 is null)
group by A.group, A.val1, A.val2, A.val3
但是!我的数据集非常大(1亿行),而且我可以预期的所有可能的组合的数量也非常大(10万行)。这样的结合实在太大了。
还有别的办法吗?我想知道我是否可以使用正则表达式,但我不知道从哪里开始。
1条答案
按热度按时间g52tjvyc1#
在示例数据中,只有第三列有多个值。因此,您可以只为其他两列填写一个值: