如何将列的当前值与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中同一列的先前值进行比较的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2012 如何将列的数据类型从位更改为日期字段?
SQL Server,将列中的所有值与另一个值的一些值连接起来