聚合和分析函数
聚合函数的作用是根据一个输入值的集合计算出一个单独的结果值,下面的表中列出了内置的聚合函数。
| 名称 | 参数个数 | 功能 | 举例 |
|---|---|---|---|
| AVG | 1 | 用于计算一个组和数据窗口内表达式的平均值。 | SELECT avg(col) FROM tb1; avg(distinct col) avg(all col) |
| COUNT | 1 | 对一组内发生的事情进行累积计数 | count(col) count(distinct col) count(all col) count(*) |
| MAX | 1 | 在一个组中的数据窗口中查找表达式的最大值 | max(col) max(distinct col) max(all col) |
| MIN | 1 | 在一个组中的数据窗口中查找表达式的最小值 | min(col) min(distinct col) min(all col) |
| SUM | 1 | 该函数计算组中表达式的累积和 | sum(col) sum(distinct col) sum(all col) |
应该注意的是除了函数 COUNT 外,当没有查询出记录时,其它函数返回空值。特别是,如果没有记录的话,函数 SUM 返回空值,而不是像期待的那样,返回 0。当必要的时候,我们可以使用函数 COALESCE 将空值替换为 0。
下面详细介绍通常用于统计分析的聚合函数。分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。之所以和上面的通用聚合函数分开列出,是为了更明确各自的功能。
窗口函数说明
分析函数(也叫窗口函数)与聚合函数,都是对行集组(一组行的集合)进行聚合计算,不同的是,聚合函数每组只能返回一个值(一行),而窗口函数每组可以返回多个值(多行)。行集组又称为窗口(Window),由 analytic_clause 定义。而窗口大小取决于实际的行数或逻辑间隔(例如时间)。组内每一行都是基于窗口的逻辑计算的结果。触发一个分析函数需要特殊的关键字 OVER 来指定窗口。
窗口函数的语法:
analytic_function ( [arguments] ) OVER ( [ partition_clause ]
[ order_by_clause [ windowing_clause ] ] )
其中:
OVER 是关键字,用于标识分析函数。
analytic_function 是指定的分析函数的名字,Oracle 分析函数很多。
分区子句的格式为: partition by[,value_expr]...关键字 partition by 子句根据由分区表达式的条件逻辑地将单个结果集分成 N 组。这里的"分区 partition"和"组 group"都是同义词。
排序子句 order-by-clause 指定数据是如何存在分区内的。其格式为:
order [ siblings ] by { expr | position | c_alias } [ asc | desc ] [ nulls first | nulls last ]
其中:
(1)asc|desc:指定了排列顺序。
(2)nulls first|nulls last:指定了包含空值的返回行应出现在有序序列中的第一个或最后一个位置。
- 窗口子句 windowing-clause 给出一个固定的或变化的数据窗口方法,分析函数将对这些数据进行操作。在一组基于任意变化或固定的窗口中,可用该子句让分析函数计算出它的值。
KEEP 函数说明
keep 是一个特殊的分析函数,他的用法不同于通过 OVER 关键字指定的分析函数,可以用于这样一种场合下:取同一个分组下以某个字段排序后,对指定字段取最小或最大的那个值。
语法:
min | max(column1) keep (dense_rank first | last ORDER BY column2)
[ OVER (PARTION BY column3) ]
示例:
emp 表格定义见【示例参考表格】
SELECT deptno, MIN(t.mgr) KEEP (DENSE_RANK FIRST ORDER BY t.sal) a
FROM emp t GROUP BY deptno;
含义:按 deptno 分组,分组内按 sal 排序,DENSE_RANK FIRST 表示保留 sal 排在前面的一组数据(当排在前面的 sal 有重复值时,保存多条数据)。然后在每组记录中,执行前面的聚合函数,这里是 min(t.mgr)。
执行结果:
DEPTNO | A
--------+------
10 | 7782
30 | 7698
20 | 7902
(3 rows)
具有统计用途的聚合函数:
| 名称 | 参数个数 | 功能 | 举例 |
|---|---|---|---|
| COVAR_POP | 2 | COVAR_POP(expr1, expr2) 返回一对表达式的总体协方差。 | |
| COVAR_SAMP | 2 | COVAR_SAMP(expr1, expr2)返回一对表达式的样本协方差。 | |
| CUME_DIST | 0~n | 计算一个值在一组值中的累积分布。 | CUME_DIST(15500, .05) WITHIN GROUP (ORDER BY salary, commission_pct) |
| RANK | 0~n | 基于 OVER 子句中的 ORDER BY 表达式确定一组值的排名。当有相同排序值时,将会有相同的排名,并且值相同的行数会被记录到下个排名中。 | RANK(15500) WITHIN GROUP (ORDER BY salary DESC) |
| DENSE_RANK | 0~n | 计算一组数值中的排序值,连续排序,有两个第二名时仍然跟着第三名。 | DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) |
| PERCENT_RANK | 0~n | 百分比排名。 | PERCENT_RANK(15000, .05) WITHIN GROUP (ORDER BY salary |
| REGR_SLOPE | 2 | REGR_SLOPE:返回斜率,等于 COVAR_POP(expr1, expr2) / VAR_POP(expr2)。 | REGR_SLOPE(expr1, expr2) |
| REGR_INTERCEPT | 2 | REGR_INTERCEPT:返回回归线的 y 截距,等于 AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)。 | REGR_INTERCEPT(expr1, expr2) |
| REGR_COUNT | 2 | 返回用于填充回归线的非空数字对的数目。 | REGR_COUNT(expr1, expr2) |
| REGR_R2 | 2 | 返回回归线的决定系数,计算式为: If VAR_POP(expr2) = 0 then return NULL If VAR_POP(expr1) = 0 AND VAR_POP(expr2) != 0 then return 1 If VAR_POP(expr1) > 0 AND VAR_POP(expr2 != 0 then return POWER(CORR(expr1,expr),2)。 | REGR_R2(expr1, expr2) |
| REGR_AVGX | 2 | 计算回归线的自变量 (expr2) 的平均值,去掉了空对 (expr1, expr2) 后,等于 AVG(expr2)。 | REGR_AVGX(expr1, expr2) |
| REGR_AVGY | 2 | 计算回归线的应变量 (expr1) 的平均值,去掉了空对 (expr1, expr2) 后,等于 AVG(expr1)。 | REGR_AVGY(expr1, expr2) |
| REGR_SXX | 2 | 返回值等于 REGR_COUNT(expr1, expr2) * VAR_POP(expr2)。 | REGR_SXX(expr1, expr2) |
| REGR_SYY | 2 | 返回值等于 REGR_COUNT(expr1, expr2) * VAR_POP(expr1)。 | REGR_SYY(expr1, expr2) |
| REGR_SXY | 2 | 返回值等于 REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)。 | REGR_SXY(expr1, expr2) |
| STDDEV | 1 | 计算当前行关于组的标准偏离。 | stddev(col) stddev(distinct col) stddev(all col) |
| STDDEV_POP | 1 | 该函数计算总体标准偏离,并返回总体变量的平方根。 | STDDEV_POP(salary) |
| STDDEV_SAMP | 1 | 该函数计算累积样本标准偏离,并返回总体变量的平方根。 | STDDEV_SAMP(salary) |
| VAR_POP | 1 | 该函数返回非空集合的总体变量(忽略null)。 | VAR_POP(salary) |
| VAR_SAMP | 1 | 该函数返回非空集合的样本变量(忽略null)。 | VAR_SAMP(salary) |
| VARIANCE | 1 | 如果表达式中行数为 1,则返回 0,如果表达式中行数大于 1,则返回 VAR_SAMP。 | variance(col) |
| CORR | 2 | 返回一对表达式的相关系数。 | CORR(list_price, min_price) |
COVAR_POP
计算协方差。
示例:
emp 表格定义见【示例参考表格】
SELECT MGR , COVAR_POP ( SYSDATE - HIREDATE , sal ) AS covar_pop ,
COVAR_SAMP ( SYSDATE - HIREDATE , sal ) AS covar_samp
FROM emp GROUP BY MGR ORDER BY MGR , covar_pop , covar_samp ;
MGR | COVAR_POP | COVAR_SAMP
------+-------------------+---------------------
7566 | 0 | 0
7698 | 43976 | 54970
7782 | 0 |
7788 | 0 |
7839 | 10547.22222222222 | 15820.833333333332
7902 | 0 | 0
| 0 |
(7 rows)
COVAR_SAMP
计算样本协方差。
示例:
emp 表格定义见【示例参考表格】
SELECT MGR , COVAR_SAMP( SYSDATE - HIREDATE , sal ) AS covar_pop ,
COVAR_SAMP ( SYSDATE - HIREDATE , sal ) AS covar_samp
FROM emp GROUP BY MGR ORDER BY MGR , covar_pop , covar_samp ;
MGR | COVAR_POP | COVAR_SAMP
------+--------------------+---------------------
7566 | 0 | 0
7698 | 54970 | 54970
7782 | |
7788 | |
7839 | 15820.833333333332 | 15820.833333333332
7902 | 0 | 0
| |
(7 rows)
CUME_DIST
计算一个值在一组值中的累积分布。返回值的范围为 0 < CUME_DIST <= 1。
示例:
emp 表格定义见【示例参考表格】
SELECT deptno , ename , sal, cume_dist ( ) OVER ( partition BY deptno ORDER BY sal DESC ) "RANK" FROM emp WHERE sal>2000;
DEPTNO | ENAME | SAL | RANK
--------+--------+-------+---------------------
10 | KING | 10000 | 0.3333333333333333
10 | CLARK | 7450 | 0.6666666666666666
10 | MILLER | 6300 | 1
20 | ADAMS | 8100 | 0.16666666666666666
20 | FORD | 8000 | 0.5
20 | SCOTT | 8000 | 0.5
20 | JONES | 7975 | 0.6666666666666666
20 | SMITH | 6800 | 0.8333333333333334
20 | SMITH | 4800 | 1
30 | BLAKE | 11850 | 0.16666666666666666
30 | ALLEN | 7600 | 0.3333333333333333
30 | TURNER | 6500 | 0.5
30 | WARD | 6250 | 0.8333333333333334
30 | MARTIN | 6250 | 0.8333333333333334
30 | JAMES | 5950 | 1
(15 rows)
RANK
确定一组值的排名。当有相同排序值时,将会有相同的排名,并且值相同的行数会被记录到下个排名中。
示例:
计算在同一个部门内,每个人的工资排名。(emp 表格定义见【示例参考表格】)
SELECT empno,ename,sal, deptno, rank() OVER (PARTITION BY deptno ORDER BY sal) FROM emp;
EMPNO | ENAME | SAL | DEPTNO | RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL)
-------+--------+-------+--------+---------------------------------------------------
7934 | MILLER | 6300 | 10 | 1
7782 | CLARK | 7450 | 10 | 2
7839 | KING | 10000 | 10 | 3
7469 | SMITH | 4800 | 20 | 1
7369 | SMITH | 6800 | 20 | 2
7566 | JONES | 7975 | 20 | 3
7902 | FORD | 8000 | 20 | 4
7788 | SCOTT | 8000 | 20 | 4
7876 | ADAMS | 8100 | 20 | 6
7900 | JAMES | 5950 | 30 | 1
7521 | WARD | 6250 | 30 | 2
7654 | MARTIN | 6250 | 30 | 2
7844 | TURNER | 6500 | 30 | 4
7499 | ALLEN | 7600 | 30 | 5
7698 | BLAKE | 11850 | 30 | 6
(15 rows)
DENSE_RANK
DENSE_RANK 窗口函数基于 OVER 子句中的 ORDER BY 表达式确定一组值中的一个值的排名。如果存在可选的 PARTITION BY子句,则为每个行组重置排名。带符合排名标准的相同值的行接收相同的排名。DENSE_RANK 功能与 RANK 的区别在于:如果两行或多行并列,则排序值序列中无间隔。例如,如果两个行的排名为 1,则下一个排名则为 2。
示例:
emp 表格定义见【示例参考表格】
antdb=# SELECT deptno, ename, sal, DENSE_RANK ( ) OVER ( partition BY deptno ORDER BY sal DESC ) "RANK" FROM emp WHERE sal>6500;
DEPTNO | ENAME | SAL | RANK
--------+--------+-------+---------
10 | KING | 10000 | 1
10 | CLARK | 7450 | 2
20 | ADAMS | 8100 | 1
20 | SCOTT | 8000 | 2
20 | FORD | 8000 | 2
20 | JONES | 7975 | 3
20 | SMITH | 6800 | 4
30 | BLAKE | 11850 | 1
30 | ALLEN | 7600 | 2
(9 rows)
PERCENT_RANK
计算给定行的百分比排名。该函数没有参数,但需要空括号。返回值范围介于 0 和 1(含 1)之间。任何集合中的第一行的 PERCENT_RANK 均为 0。
示例:
计算每一个员工在同一种职位内的百分比排名。(emp 表格定义见【示例参考表格】)
SELECT empno,job, sal, percent_rank() OVER (PARTITION BY job ORDER BY sal) FROM emp;
EMPNO | JOB | SAL | PERCENT_RANK() OVER (PARTITION BY JOB ORDER BY SAL)
-------+-----------+-------+-------------------------------------------------------
7902 | ANALYST | 8000 | 0
7788 | ANALYST | 8000 | 0
7469 | CLERK | 4800 | 0
7900 | CLERK | 5950 | 0.25
7934 | CLERK | 6300 | 0.5
7369 | CLERK | 6800 | 0.75
7876 | CLERK | 8100 | 1
7782 | MANAGER | 7450 | 0
7566 | MANAGER | 7975 | 0.5
7698 | MANAGER | 11850 | 1
7839 | PRESIDENT | 10000 | 0
7521 | SALESMAN | 6250 | 0
7654 | SALESMAN | 6250 | 0
7844 | SALESMAN | 6500 | 0.6666666666666666
7499 | SALESMAN | 7600 | 1
(15 rows)
REGR_SLOPE
计算斜率。
示例:
CREATE TABLE tb(id int, num int);
INSERT into tb values(1, 298),(2, 368),(3, 458),(4, 328),(5, 108),(6, 667),(7, 123),(8, 555);
SELECT count(*),regr_slope(t.num,tb.num) FROM
(SELECT id-1 AS id, num FROM tb) AS t,tb WHERE t.id=tb.id ;
COUNT(*) | REGR_SLOPE(T.NUM,TB.NUM)
----------+-----------------------------
28 | -0.8425517064826854
(1 row)
REGR_INTERCEPT
计算截距。
示例:
CREATE TABLE tb(id int, num int);
INSERT into tb values(1, 298),(2, 368),(3, 458),(4, 328),(5, 108),(6, 667),(7, 123),(8, 555);
SELECT count(*),regr_intercept(t.num,tb.num) FROM
(SELECT id-1 AS id, num FROM tb) AS t,tb WHERE t.id=tb.id ;
COUNT(*) | REGR_INTERCEPT(T.NUM,TB.NUM)
----------+---------------------------------
28 | 655.2852157477586
(1 row)
REGR_COUNT
regr_count(y, x) 计算 x 和 y 都不是空的记录数。
示例:
CREATE TABLE tb(id int, num int);
INSERT into tb values(1, 298),(2, null),(3, null),(null, 328),(null, 108),(6, 667);
SELECT regr_count(id, num) FROM tb;
REGR_COUNT(ID, NUM)
----------------------
2
(1 row)
REGR_R2
计算相关性,相关性越高,说明这组数据用于预估的准确度越高。当获得最高的相关性(接近1)时,预测数据最准确。
示例:
CREATE TABLE tb(id int, num int);
INSERT INTO tb values(1, 298),(2, 368),(3, 458),(4, 328),(5, 108),(6, 667),(7, 123),(8, 555);
计算两组数据的相关性:
SELECT count(*),regr_r2(t.num,tb.num) FROM
(SELECT id-1 AS id, num FROM tb) AS t,tb WHERE t.id=tb.id ;
COUNT(*) | REGR_R2(T.NUM,TB.NUM)
----------+--------------------------
28 | 0.6088521468006012
(1 row)
REGR_AVGX
regr_avgx(y, x) 其实就是算 x 的平均值(数学期望), y 在这里没有任何作用。
REGR_AVGY
regr_avgy(y, x) 其实就是算 y 的平均值(数学期望) ,x 在这里没有任何作用。
REGR_SXX
返回值等于 REGR_COUNT(expr1, expr2) * VAR_POP(expr2) 。
REGR_SYY
返回值等于 REGR_COUNT(expr1, expr2) * VAR_POP(expr1) 。
REGR_SXY
返回值等于 REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)。
STDDEV
计算当前行关于组的标准偏离。
示例:
例返回部门 30 按雇佣日期排序的薪水值的累积标准偏离。(emp 表格定义见【示例参考表格】)
SELECT ename,hiredate,sal,stddev(sal) OVER(ORDER BY hiredate) a FROM emp WHERE deptno=20;
ENAME | HIREDATE | SAL | A
-------+---------------------+------+-------------------
SMITH | 1980-12-17 00:00:00 | 4800 | 1414.213562373095
SMITH | 1980-12-17 00:00:00 | 6800 | 1414.213562373095
JONES | 1981-04-02 00:00:00 | 7975 | 1605.264775667865
FORD | 1981-12-03 00:00:00 | 8000 | 1503.935808692202
SCOTT | 1987-04-19 00:00:00 | 8000 | 1393.24262065155
ADAMS | 1987-05-23 00:00:00 | 8100 | 1309.428946780491
(6 rows)
STDDEV_POP
该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与 VAR_POP 函数的平方根相同。(emp 表格定义见【示例参考表格】)
示例:
SELECT deptno,ename,sal,stddev_pop(sal) OVER (PARTITION BY deptno) AS pop FROM emp;
DEPTNO | ENAME | SAL | POP
---------------+------------+------------+-------------------
10 | KING | 10000 | 1546.142152441216
10 | CLARK | 7450 | 1546.142152441216
10 | MILLER | 6300 | 1546.142152441216
20 | SCOTT | 8000 | 1195.339619336511
20 | SMITH | 6800 | 1195.339619336511
20 | JONES | 7975 | 1195.339619336511
20 | FORD | 8000 | 1195.339619336511
20 | ADAMS | 8100 | 1195.339619336511
20 | SMITH | 4800 | 1195.339619336511
30 | ALLEN | 7600 | 2057.506581601462
30 | MARTIN | 6250 | 2057.506581601462
30 | TURNER | 6500 | 2057.506581601462
30 | JAMES | 5950 | 2057.506581601462
30 | BLAKE | 11850 | 2057.506581601462
30 | WARD | 6250 | 2057.506581601462
(15 rows)
STDDEV_SAMP
该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与 VAR_POP 函数的平方根相同。
示例:
begin;
CREATE TABLE employees (manager_id INT,last_name varchar(50),hiredate varchar(50),SALARY INT);
INSERT INTO employees VALUES(100, 'Raphaely', '2017-07-01', 1700);
INSERT INTO employees VALUES(100, 'De Haan', '2018-05-01',11000);
INSERT INTO employees VALUES(100, 'Errazuriz', '2017-07-21', 1400);
INSERT INTO employees VALUES(100, 'Hartstein', '2019-05-01',14000);
INSERT INTO employees VALUES(100, 'Raphaely', '2017-07-22', 1700);
INSERT INTO employees VALUES(100, 'Weiss', '2019-07-11',13500);
INSERT INTO employees VALUES(100, 'Russell', '2019-10-05', 13000);
INSERT INTO employees VALUES(100, 'Partners', '2018-12-01',14000);
INSERT INTO employees VALUES(200, 'Ross', '2019-06-11',13500);
INSERT INTO employees VALUES(200, 'Bell', '2019-05-25', 13000);
INSERT INTO employees VALUES(200, 'Part', '2018-08-11',14000);
COMMIT;
SELECT manager_id, last_name, hiredate, salary,STDDEV_SAMP(salary) OVER (PARTITION BY manager_id
ORDER BY hiredate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev FROM employees ORDER BY manager_id, last_name, hiredate, salary, cum_sdev;
MANAGER_ID | LAST_NAME | HIREDATE | SALARY | CUM_SDEV
------------+-----------+------------+--------+--------------------
100 | De Haan | 2018-05-01 | 11000 | 4702.127178203499
100 | Errazuriz | 2017-07-21 | 1400 | 212.132034355964
100 | Hartstein | 2019-05-01 | 14000 | 6340.346993658943
100 | Partners | 2018-12-01 | 14000 | 6064.899009876422
100 | Raphaely | 2017-07-01 | 1700 |
100 | Raphaely | 2017-07-22 | 1700 | 173.205080756888
100 | Russell | 2019-10-05 | 13000 | 6026.474330580265
100 | Weiss | 2019-07-11 | 13500 | 6244.31169717116
200 | Bell | 2019-05-25 | 13000 | 707.106781186548
200 | Part | 2018-08-11 | 14000 |
200 | Ross | 2019-06-11 | 13500 | 500
(11 rows)
VAR_POP
该函数返回分组序列的总体方差。
示例:
emp 表格定义见【示例参考表格】
SELECT empno, sal, VAR_pop(sal) OVER (ORDER BY hiredate) AS "var_pop"
FROM emp ORDER BY ename, sal, "var_pop" ;
EMPNO | SAL | var_pop
------------+----------+----------------------
7876 | 8100 | 2799183.333333333333
7499 | 7600 | 1386666.666666666667
7698 | 11850 | 4748003.472222222222
7782 | 7450 | 4070841.836734693878
7902 | 8000 | 3328381.076388888889
7900 | 5950 | 3328381.076388888889
7566 | 7975 | 1251400
7839 | 10000 | 3729306.25
7654 | 6250 | 3401111.111111111111
7934 | 6300 | 3166597.633136094675
7788 | 8000 | 2967286.352040816327
7469 | 4800 | 1000000
7369 | 6800 | 1000000
7844 | 6500 | 3678505.859375
7521 | 6250 | 1044218.75
(15 rows)
VAR_SAMP
该函数返回分组序列的样本方差。
示例:
emp 表格定义见【示例参考表格】
SELECT empno, sal, VAR_samp(sal) OVER (ORDER BY hiredate) AS "var_samp"
FROM emp ORDER BY ename, sal, "var_samp" ;
EMPNO | SAL | var_samp
-------+-------+-----------------------
7876 | 8100 | 2999125
7499 | 7600 | 2080000
7698 | 11850 | 5697604.166666666667
7782 | 7450 | 4749315.47619047619
7902 | 8000 | 3630961.174242424242
7900 | 5950 | 3630961.174242424242
7566 | 7975 | 1564250
7839 | 10000 | 4143673.611111111111
7654 | 6250 | 3826250
7934 | 6300 | 3430480.769230769231
7788 | 8000 | 3195539.148351648352
7469 | 4800 | 2000000
7369 | 6800 | 2000000
7844 | 6500 | 4204006.696428571429
7521 | 6250 | 1392291.666666666667
(15 rows)
VARIANCE
计算指定列的方差。
示例:
计算列 sal 的方差(emp 表格定义见【示例参考表格】):
SELECT empno, sal, VARIANCE(sal) OVER (ORDER BY hiredate) "Variance"
FROM emp ORDER BY ename, sal, "Variance";
EMPNO | SAL | Variance
-------+-------+------------------------
7876 | 8100 | 2999125
7499 | 7600 | 2080000
7698 | 11850 | 5697604.166666666667
7782 | 7450 | 4749315.47619047619
7902 | 8000 | 3630961.174242424242
7900 | 5950 | 3630961.174242424242
7566 | 7975 | 1564250
7839 | 10000 | 4143673.611111111111
7654 | 6250 | 3826250
7934 | 6300 | 3430480.769230769231
7788 | 8000 | 3195539.148351648352
7469 | 4800 | 2000000
7369 | 6800 | 2000000
7844 | 6500 | 4204006.696428571429
7521 | 6250 | 1392291.666666666667
(15 rows)
CORR
计算一对表达式的相关系数。
示例:
-- t1 表格定义:
CREATE TABLE t1(id int, num int);
INSERT into t1 values(1, 298),(2, 368),(3, 458),(4, 328),(5, 108),(6, 667),(7, 123),(8, 555);
antdb=# SELECT corr(t.num,t1.num) FROM
antdb-# (SELECT id-1 AS id, num FROM t1) AS t,t1 WHERE t.id=t1.id ;
CORR(T.NUM,T1.NUM)
------------------------------
-0.7802897838627655
(1 row)




