马哈鱼间接数据流中的where-group-by子句

马哈鱼间接数据流中的where-group-by子句

本文介绍间接数据流中的where-group-by子句。

 

1、列在where子句中

WHERE子句中源表中的某些列不影响目标列,但对所选行集至关重要,因此应保存这些列以进行影响分析,并向目标表间接提供数据流。

以下述SQL为例:

SELECT a.empName "eName" FROM scott.emp a Where sal > 1000

select列表的总行数受where子句中sal列的值影响,我们为这种关系建立了一个间接数据流:

scott.emp.sal -> indirect -> RS-1.RelationRows

数据流图示:

 

2. COUNT()

COUNT()函数是一个聚合函数,用于计算关系的总行数。

2.1 where子句中不包含 group by

示例SQL:

SELECT COUNT() num_emp FROM scott.emp where city=1

在上面的SQL中,将创建两个间接数据流,因为COUNT()的值受where子句中的city列和scott.emp表的总行数的影响。

scott.emp.city -> indirect -> COUNT()
scott.emp.RelationRow -> indirect -> COUNT()

数据流图示:

2.2 where 子句中包含 group by

SELECT deptno, count() total_num
FROM scott.emp
where city=1
group by deptno;

如您所见,除了在前面的SQL中创建的两个间接数据流之外,还使用GROUPBY子句中的deptno创建了第三个间接数据流。

scott.emp.city -> indirect -> COUNT()
scott.emp.Relations -> indirect -> COUNT()
scott.emp.deptno -> indirect -> COUNT()

3. 其他聚合函数

创建间接数据流时,其他聚合函数,如SUM()的工作原理与COUNT()函数略有不同。

3.1 where子句中包含 group by

SELECT deptno, SUM(SAL) sal_sum
FROM scott.emp
where city=1
group by deptno

聚合函数(如SUM()根据group by子句中使用的列确定的记录集计算值,因此group by子句中的deptno列用于创建一个间接数据流到SUM()函数。

从deptno到SUM()创建了一个间接数据流。

scott.emp.deptno -> indirect -> SUM()

如果出现group by子句,RelationRows伪列将不用于创建间接数据流。

3.2 where 子句中不包含 group by

SELECT SUM(SAL) sal_sum
FROM scott.emp
where city=1

上面的SQL表示表的整个记录集将用于计算SUM()函数的值。

因此,将创建两个间接数据流,如下所示:

scott.emp.city -> indirect -> SUM()
scott.emp.RelationRows -> indirect -> SUM()

4、参考

马哈鱼数据血缘分析器: https://sqlflow.gudusoft.com

马哈鱼数据血缘分析器中文网站: https://www.sqlflow.cn

posted @ 2022-02-08 22:30  syforacle  阅读(72)  评论(0编辑  收藏  举报