暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

依靠Expand实现aggr distinct(3)

原创 手机用户2895 2024-10-29
171

处理非DISTINCT的agg

这一步,我们先处理SUM(col2)与SUM(col3),对Expand后的表应用如下GROUPBY

SELECT COL1, SUM(COL2), SUM(COL3), COL4, COL5, E_FLAG FROM tex1 GROUP BY COL1, COL4, COL5, E_FLAG;

这个SQL的结果我们记作tmp1,tmp1的数据如下表所示

COL1 SUM(COL2) SUM(COL3) COL4 COL5 E_FLAG
1 10 10 NULL NULL 0
2 15 15 NULL NULL 0
1 3 3 1 NULL 1
1 3 3 2 NULL 1
1 4 4 3 NULL 1
2 3 3 1 NULL 1
2 12 12 3 NULL 1
1 3 3 1 1 2
1 3 3 2 2 2
1 4 4 3 2 2
2 3 3 1 2 2
2 12 12 3 2 2

注意,这里的头两行就是我们所有非agg distinct的结果

依次处理DISTINCT的agg

处理SUM(DISTINCT COL4)

注意tmp1的数据中,所有E_FLAG = 1的数据中的col4已经变成了distinct的数据,我们接下来在tmp1上做第二个groupby,结果记为tmp2

SELECT COL1, SUM(COL2), SUM(COL3), SUM(COL4), COL5, E_FLAG FROM tmp1 GROUP BY COL1, COL5, E_FLAG;

tmp2的结果如下表所示

COL1 SUM(COL2) SUM(COL3) SUM(COL4) COL5 E_FLAG
1 10 10 NULL NULL 0
2 15 15 NULL NULL 0
1 10 10 6 NULL 1
2 15 15 4 NULL 1
1 3 3 1 1 2
1 7 7 5 2 2
2 15 15 4 2 2

这里EFLAG = 1的数据即为SUM(DISTINCT COL4)的结果

处理SUM(DISTINCT COL5)

类似的,继续执行

SELECT COL1, SUM(COL2), SUM(COL3), SUM(COL4), SUM(COL5), E_FLAG FROM tmp2 GROUP BY COL1, E_FLAG;

得到表tmp3

COL1 SUM(COL2) SUM(COL3) SUM(COL4) SUM(COL5) E_FLAG
1 10 10 NULL NULL 0
2 15 15 NULL NULL 0
1 10 10 6 NULL 1
2 15 15 4 NULL 1
1 10 10 6 3 2
2 15 15 4 2 2

tmp3中包含了SUM(DISTINCT col5)的结果

合并结果集

上文中的tmp3已经包含了所有agg函数的结果,但是行中都只有部分agg的结果,现在需要把这些结果合并起来,使用以下SQL

SELECT col1, MIN(IF(E_FLAG = 0, SUM(COL2), NULL)), MIN(IF(E_FLAG = 0, SUM(COL3), NULL)), MIN(IF(E_FLAG = 1, SUM(COL4), NULL)), MIN(IF(E_FLAG = 2, SUM(COL5), NULL)) FROM tmp3 GROUP BY COL1

这样就得到了最终的结果

col1 SUM(COL2) SUM(COL3) SUM(DISTINCT col4) SUM(DISTINCT col5)
1 10 10 6 3
2 15 15 4 2
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论