处理非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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




