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类型。