如何将列的当前值与sql server和Oracle中同一列的先前值进行比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将列的当前值与sql server和Oracle中同一列的先前值进行比较相关的知识,希望对你有一定的参考价值。

我必须将列的当前值与同一列的先前值进行比较。我的条件是这样的:如果T1.C1 =上一个T1.C1和T1.C2 =上一个T1.C2和T1.C3 ='somw值'那么显示T1.C3为(prevT1.C3 +1)有人可以请让我知道如何在sql server和oracle中实现这一点

答案

它是LAG分析函数。例如(基于Oracle,Scott的示例模式;我相信MS SQL Server的工作原理与此类似,可能在语法上略有不同)。注意第5行。

SQL> WITH temp
  2       AS (SELECT empno,
  3                  ename,
  4                  sal,
  5                  LAG (sal) OVER (ORDER BY empno) prev_sal
  6             FROM emp)
  7    SELECT ename,
  8           sal,
  9           prev_sal,
 10           --
 11           CASE
 12              WHEN sal > prev_sal THEN 'higher'
 13              WHEN sal < prev_sal THEN 'lower'
 14              ELSE 'equal'
 15           END
 16              "sal compared to previous sal"
 17      FROM temp
 18  ORDER BY empno;

ENAME             SAL   PREV_SAL sal compared to previous sal
---------- ---------- ---------- ------------------------------
SMITH             920            equal
ALLEN            1600        920 higher
WARD             1250       1600 lower
JONES            2975       1250 higher
MARTIN           1250       2975 lower
BLAKE            2850       1250 higher
CLARK            2450       2850 lower
SCOTT            3000       2450 higher
KING            10000       3000 higher
TURNER           1500      10000 lower
ADAMS            1100       1500 lower
JAMES             950       1100 lower
FORD             3000        950 higher
MILLER           1300       3000 lower

14 rows selected.

SQL>
另一答案

WITH CUR_VAL AS(SELECT C1,C2,C3,..,ROW_NUMBER()OVER(ORDER BY C1)RK FROM T1),PREV_VAL AS(SELECT C1,C2,C3,... ,, ROW_NUMBER()OVER(ORDER BY) C1)+1 RK1 FROM T1)SELECT A.C1,B.C1 PREV_C1,B.RK1,FROM CUR_VAL A,PREV_VAL B WHERE A.RK = B.RK1 ORDER BY RK1

以上是关于如何将列的当前值与sql server和Oracle中同一列的先前值进行比较的主要内容,如果未能解决你的问题,请参考以下文章