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