lag/lead分析函数

LAG  (value_expression [,offset] [,default]) OVER ([query_partition_clase] order_by_clause)
LEAD (value_expression [,offset] [,default]) OVER ([query_partition_clase] order_by_clause)

 

  • value_expression - 可以是一个列名也可以是一个内置函数
  • offset - 偏移的行数默认为1.
  • default - 如果是首行(lag)或末行(lead)的返回值. 默认值为 NULL.

SELECT empno,
       ename,
       job,
       sal
FROM   emp
ORDER BY sal;

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7369 SMITH      CLERK            800
      7900 JAMES      CLERK            950
      7876 ADAMS      CLERK           1100
      7521 WARD       SALESMAN        1250
      7654 MARTIN     SALESMAN        1250
      7934 MILLER     CLERK           1300
      7844 TURNER     SALESMAN        1500
      7499 ALLEN      SALESMAN        1600
      7782 CLARK      MANAGER         2450
      7698 BLAKE      MANAGER         2850
      7566 JONES      MANAGER         2975
      7788 SCOTT      ANALYST         3000
      7902 FORD       ANALYST         3000
      7839 KING       PRESIDENT       5000

14 rows selected.

SQL>

 

 

SELECT empno,
       ename,
       job,
       sal,
       LAG(sal, 1, 0) OVER (ORDER BY sal) AS sal_prev,
       sal - LAG(sal, 1, 0) OVER (ORDER BY sal) AS sal_diff
FROM   emp;

     EMPNO ENAME      JOB              SAL   SAL_PREV   SAL_DIFF
---------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK            800          0        800
      7900 JAMES      CLERK            950        800        150
      7876 ADAMS      CLERK           1100        950        150
      7521 WARD       SALESMAN        1250       1100        150
      7654 MARTIN     SALESMAN        1250       1250          0
      7934 MILLER     CLERK           1300       1250         50
      7844 TURNER     SALESMAN        1500       1300        200
      7499 ALLEN      SALESMAN        1600       1500        100
      7782 CLARK      MANAGER         2450       1600        850
      7698 BLAKE      MANAGER         2850       2450        400
      7566 JONES      MANAGER         2975       2850        125
      7788 SCOTT      ANALYST         3000       2975         25
      7902 FORD       ANALYST         3000       3000          0
      7839 KING       PRESIDENT       5000       3000       2000

14 rows selected.

SQL>
 
SELECT empno,
       ename,
       job,
       sal,
       LEAD(sal, 1, 0) OVER (ORDER BY sal) AS sal_next,
       LEAD(sal, 1, 0) OVER (ORDER BY sal) - sal AS sal_diff
FROM   emp;

     EMPNO ENAME      JOB              SAL   SAL_NEXT   SAL_DIFF
---------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK            800        950        150
      7900 JAMES      CLERK            950       1100        150
      7876 ADAMS      CLERK           1100       1250        150
      7521 WARD       SALESMAN        1250       1250          0
      7654 MARTIN     SALESMAN        1250       1300         50
      7934 MILLER     CLERK           1300       1500        200
      7844 TURNER     SALESMAN        1500       1600        100
      7499 ALLEN      SALESMAN        1600       2450        850
      7782 CLARK      MANAGER         2450       2850        400
      7698 BLAKE      MANAGER         2850       2975        125
      7566 JONES      MANAGER         2975       3000         25
      7788 SCOTT      ANALYST         3000       3000          0
      7902 FORD       ANALYST         3000       5000       2000
      7839 KING       PRESIDENT       5000          0      -5000

14 rows selected.

SQL>
 
http://www.oracle-base.com/articles/misc/LagLeadAnalyticFunctions.php
LAGLEAD是常用的开窗函数,允许在当前行的前面或后面的行中访问数据,适合多种计算场景[^1]。 在时间序列分析场景中,可使用这些函数分析趋势和变化。比如分析股票价格走势,要计算每日股票价格的变化率,就可以用LAG函数获取前一天的股票价格,再与当天价格对比。示例代码如下: ```sql SELECT trading_date, stock_price, (stock_price - LAG(stock_price, 1) OVER (ORDER BY trading_date)) / LAG(stock_price, 1) OVER (ORDER BY trading_date) AS price_change_rate FROM stock_prices; ``` 在数据验证与异常检测方面,可利用LAGLEAD函数检查数据的连续性和异常值。以传感器数据监测为例,检查相邻时间点的传感器读数是否在合理范围内,若超出范围则视为异常。示例代码如下: ```sql SELECT sensor_id, reading_time, sensor_reading, CASE WHEN ABS(sensor_reading - LAG(sensor_reading, 1) OVER (PARTITION BY sensor_id ORDER BY reading_time)) > threshold THEN '异常' ELSE '正常' END AS status FROM sensor_data; ``` 在排名与比较场景里,可结合LAGLEAD函数对数据进行排名和比较。例如在学生成绩排名中,查看每个学生与前一名学生的分数差距。示例代码如下: ```sql SELECT student_id, score, score - LAG(score, 1) OVER (ORDER BY score DESC) AS score_difference FROM student_scores; ``` 在事件序列分析中,可分析事件发生的先后顺序和间隔时间。比如分析用户在网站上的操作记录,计算两次操作之间的时间间隔。示例代码如下: ```sql SELECT user_id, action_time, action_time - LAG(action_time, 1) OVER (PARTITION BY user_id ORDER BY action_time) AS time_interval FROM user_actions; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值