SQL语句——17、统计函数

时间:2022-02-25 04:49:26

max()、min()、avg()、sum()、count()

SQL> select deptno,ename,sal,
            sum(sal) over(partition by deptno order by deptno) sum_sal,
            round(avg(sal) over(partition by deptno)) avg_sal,
            count(*) over(partition by deptno) count_deptno
      from emp;

   DEPTNO     ENAME       SAL      SUM_SAL    AVG_SAL   COUNT_DEPTNO
---------- ---------- ---------- ---------- ---------- ------------
    10        CLARK       2450       8750       2917         3
    10        KING        5000       8750       2917         3
    10        MILLER      1300       8750       2917         3
    20        JONES       2975      10875       2175         5
    20        FORD        3000      10875       2175         5
    20        ADAMS       1100      10875       2175         5
    20        SMITH       800       10875       2175         5
    20        SCOTT       3000      10875       2175         5
    30        WARD        1250       9400       1567         6
    30        TURNER      1500       9400       1567         6
    30        ALLEN       1600       9400       1567         6
    30        JAMES       950        9400       1567         6
    30        BLAKE       2850       9400       1567         6
    30        MARTIN      1250       9400       1567         6

14 rows selected.

 

first_value()和last_value()

获取第一条记录和后一条记录。
FIRST_VALUE (expr) OVER (analytic_clause)
例:将当前月份的销量除以前一个月份的销量,并将当前月份的销量除以下一个月份的销量。

select month,
       sum(amount) as mount_amount,
       sum(amount)/first_value(sum(amount) )over (order by month rows between 1 preceding and 1 following) as curr_div_prev,
       sum(amount)/last_value(sum(amount)) over (order by month rows between 1 preceding and 1 following) as curr_div_next
  from all_sales
 where year=2003
 group by month
 order by month
 

id month       month_amount        curr_div_prev      curr_div_next
-- -------  -----------------    ----------------   -------------------
1    1          95525.55                 1             0.818755807
2    2          116671.6            1.221365383        0.727796855
3    3          160307.92           1.374009785        0.910846665
4    4          175998.8            1.097879631        1.140261993
5    5          154349.44           0.876991434        1.235276191
6    6          124951.36           0.809535558        0.733729756
7    7          170296.16           1.362899611        0.800505867
8    8          212735.68           1.249210082        1.065758334
9    9          199609.68           0.93829902         0.754722791
10   10         264480.79           1.3249898          1.650714777
11   11         160221.98           0.605798175        1.166640806
12   12         137336.17           0.857161858             1

 

lag()和lead()函数

lag()和lead()函数可获得位于距当前记录指定距离处的那条记录中的数据。lead 和lag 的语法类似,以下以lag为例进行讲解。

lag(exp_str,offset,defval) over()

  • exp_str 是要做对比的字段
  • offset 是exp_str字段的偏移量 比如说 offset 为2 则 拿exp_str的第一行和第三行对比,第二行和第四行,依次类推,offset的默认值为1!
  • defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。

窗口函数

UNBOUNDED PRECEDING:表示窗口从分区的第一行开始。

UNBOUNDED FOLLOWING表示窗口在分区的最后一行结束。

CURRENT ROW:

  • 作为起点时,指定窗口从当前行或当前值开始(取决于指定ROW或RANGE)。在这种情况下,终点不能为value_expr PRECEDING。
  • 作为终点时,指定窗口在当前行或当前值处结束(取决于指定ROW或RANGE)。在这种情况下,起点不能为value_expr FOLLOWING。

value_expr PRECEDING或value_expr FOLLOWING 

  • 如果value_expr FOLLOWING是起点,则终点必须为value_expr FOLLOWING。
  • 如果value_expr PRECEDING是终点,那么起点必须是value_expr PRECEDING。

物理偏移量和逻辑偏移量

如果指定ROWS:

  • value_expr是物理偏移量。它必须是一个常数或表达式,并且必须为正数。
  • 如果value_expr是起点,则它必须是终点之前的一行。

如果指定RANGE:

  • value_expr是逻辑偏移量。它必须是一个常数或表达式,其结果为正数值或间隔值。
  • 如果value_expr计算结果为数字值,则ORDER BY expr必须为数字或DATE类型。
  • 如果value_expr计算为间隔值,则ORDER BY expr必须为DATE类型。