馬哈魚間接數據流中的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、參考

馬哈魚數據血緣分析器: //sqlflow.gudusoft.com

馬哈魚數據血緣分析器中文網站: //www.sqlflow.cn