Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从审计表中获取旧值和新值_Sql_Sql Server_Triggers_Unpivot - Fatal编程技术网

Sql 如何从审计表中获取旧值和新值

Sql 如何从审计表中获取旧值和新值,sql,sql-server,triggers,unpivot,Sql,Sql Server,Triggers,Unpivot,您好,我正在处理审计数据,我在表格中有以下数据 colm1 colm2 colm3 f1 50 4/5/2017 3.38 f1 70 4/5/2017 3.40 f1 80 5/5/2017 3.40 f1 30 5/5/2017 5.40 我想显示表中的更改时间和内容 期望输出 colm1 oldvalue newvalue date f1 50 70

您好,我正在处理审计数据,我在表格中有以下数据

colm1  colm2   colm3  

f1      50     4/5/2017 3.38

f1      70     4/5/2017 3.40

f1      80     5/5/2017 3.40

f1      30     5/5/2017 5.40
我想显示表中的更改时间和内容 期望输出

colm1   oldvalue  newvalue  date 

f1      50         70       4/5/2017

f1      70         80       5/5/2017

f1      80         30       5/5/2017

您可以使用
lag()
执行此操作:

如果只需要三行:

select a.*
from (select a.colm1, a.colm2 as newvalue,
             lag(colm2) over (partition by colm1 order by colm3) as prevvalue,
             colum3
      from audit a
     ) a
where prevvalue is not null;
输出

colm1   OldValue    newvalue    colm3
----------------------------------------
f1      50           70         4/5/2017
f1      70           80         5/5/2017
f1      80           30         5/5/2017

如何进行更改?通过前端或SQL中的by update语句标记您正在使用的dbms。解决方案可能是特定于产品的。@Chendur它是一个审计表,通过触发insert或update@AvuthuBhargavaReddy只要它解决了你的需求就可以了!如果我想滞后超过一列呢?假设我有第4列,我想要colm2和colm4的两个值,如果我想要滞后于多个列呢?假设我有第4列,我想要colm2和colm4@AvuthuBhargavaReddy . . . 然后您将添加更多的
lag()
表达式。
;With cte(colm1 ,colm2,colm3)
AS
(
SELECT 'f1', 50 ,'4/5/2017 3.38'    Union all
SELECT 'f1', 70 ,'4/5/2017 3.40'    Union all
SELECT 'f1', 80 ,'5/5/2017 3.40' Union all
SELECT 'f1', 30 ,'5/5/2017 5.40'
)
SELECT colm1,Val AS OldValue,colm2 AS newvalue,colm3 From
(
SELECT colm1 ,colm2,LAG(colm2)OVER( order by colm3 )Val,LEFT(colm3,8)colm3 from cte 
)dt
WHERE dt.Val iS NOT NULL 
colm1   OldValue    newvalue    colm3
----------------------------------------
f1      50           70         4/5/2017
f1      70           80         5/5/2017
f1      80           30         5/5/2017