ITPub博客

首页 > Linux操作系统 > Linux操作系统 > FUN--学习分析函数之lag篇

FUN--学习分析函数之lag篇

原创 Linux操作系统 作者:vongates 时间:2019-05-17 18:48:05 0 删除 编辑
我们都知道在oracle有很多分析函数可以帮助我们用简单的sql语句来得到想象中很为复杂的结果集。它们可以提高我们查询速度,实现sql性能的极大提高。因为要通过计算erp中的安全库存,生管提出这样的一个要求要用到前4个月的使用量来计算,取当前月的前4个月,我们要如何来实现呢。它让我想到了lag这个分析函数。我们看下面的例子。这时在家里做的,没有应用到实际的环境中。呵呵,知道了原理应该就没有问题了。。我们一起来吧。

先看一下它的标准语法:
LAG ( value_expr [, offset] [, default] )
  OVER ( [query_partition_clause] order_by_clause )
LAG无须自合并就可以获取同一个表格中的多行记录。
如果不指定区距,默认值为1。
如果区距超出窗口范围,则返回可指定默认值。
如不指定默认值,则默认值为null。

我们来看一个例子吧!
SQL> SELECT ename, hiredate, sal FROM emp WHERE job = 'CLERK';

ENAME      HIREDATE          SAL
---------- ----------- ---------
SMITH      1980-12-17    1400.00
ADAMS      1987-5-23     1100.00
JAMES      1981-12-3      950.00
MILLER     1982-1-23     1300.00

SQL>

如果我们要在上面的4笔记录中取出每个人之前雇佣员工的工资,如何写我们的sql呢?

SQL> SELECT ename,
  2         hiredate,
  3         sal,
  4         LAG(sal, 1, 0) OVER(ORDER BY hiredate) AS PreSal
  5    FROM emp
  6   WHERE job = 'CLERK';

ENAME      HIREDATE          SAL     PRESAL
---------- ----------- --------- ----------
SMITH      1980-12-17    1400.00          0
JAMES      1981-12-3      950.00       1400
MILLER     1982-1-23     1300.00        950
ADAMS      1987-5-23     1100.00       1300

SQL>

同样如果我们想取每个人之前的两位雇佣员工的工资,如何写我们的sql呢?
SQL> SELECT ename,
  2         hiredate,
  3         sal,
  4         LAG(sal, 1, 0) OVER(ORDER BY hiredate) AS PreSal,
  5         LAG(sal, 2, 0) OVER(ORDER BY hiredate) AS PreSal2
  6    FROM emp
  7   WHERE job = 'CLERK';

ENAME      HIREDATE          SAL     PRESAL    PRESAL2
---------- ----------- --------- ---------- ----------
SMITH      1980-12-17    1400.00          0          0
JAMES      1981-12-3      950.00       1400          0
MILLER     1982-1-23     1300.00        950       1400
ADAMS      1987-5-23     1100.00       1300        950

SQL>

更多的我们就可想而知了哟。。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29987/viewspace-51726/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-09-11

  • 博文量
    449
  • 访问量
    292652