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

2022-04-28

    本文介绍间接数据流中的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