Oracle ---- 窗口函数

Posted Scott

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle ---- 窗口函数相关的知识,希望对你有一定的参考价值。

今天讲一下错行函数(lag,lead)函数如何使用窗口函数。

Lag(exp_str,offset,defval) over()  
Lead(exp_str,offset,defval) over()  

    --exp_str要取的列  
    --offset取偏移后的第几行数据  
    --defval:没有符合条件的默认值

下面是表“test_student_score”的全部记录。

SQL> select t.* from test_student_score t;

STUDENT_ID SUBJECT_ID      SCORE
---------- ---------- ----------
         1          1         90
         3          4         91
         3          1         93
         3          3         94
         3          2         94
         1          4         95
         2          2         95
         2          4         97
         2          1         98
         1          2         98
         2          3         98
         1          3         99

12行が選択されました。

先看一下不用这两个函数式的原始输出:

SQL> select * from test_student_score t where t.subject_id = 3;

STUDENT_ID SUBJECT_ID      SCORE
---------- ---------- ----------
         1          3         99
         2          3         98
         3          3         94

下面我们不仅要看“score”,还要看看排在他前一位的“score”。

SQL> select t.subject_id,
       t.subject_id,
       lag(t.score, 1, -1) over(order by t.score) as lags,
       t.score
  from test_student_score t
where t.subject_id = 3;  2    3    4    5    6

SUBJECT_ID SUBJECT_ID       LAGS      SCORE
---------- ---------- ---------- ----------
         3          3         -1         94
         3          3         94         98
         3          3         98         99

lags”就是前一位的“score”。

现在我们还要看看排在他后一位的“score”。

SQL> select t.subject_id,
       t.subject_id,
       lag(t.score, 1, -1) over(order by t.score) as lags,
       t.score,
       lead(t.score, 1, -1) over(order by t.score) as leads
  from test_student_score t
where t.subject_id = 3;

SUBJECT_ID SUBJECT_ID       LAGS      SCORE      LEADS
---------- ---------- ---------- ---------- ----------
         3          3         -1         94         98
         3          3         94         98         99
         3          3         98         99         -1

leads”就是后一位的“score”。

Do you get it?

2021/04/19 @ Dalian

以上是关于Oracle ---- 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Toad for Oracle 中使用自定义代码片段?

Oracle ---- 窗口函数

Oracle ---- 窗口函数

Oracle ---- 窗口函数

Oracle开发之窗口函数 rows between unbounded preceding and current row

Oracle 分析窗口函数