Sql根据迁移的数据计算历史记录

时间:2014-04-22 06:41:38

标签: sql sql-server

我有一些如下所示的数据。

Table with some sample data

问题是,我必须根据数字来计算历史。假设数字是提交表格的唯一标识"。每当任何列的值发生变化时,我都必须提取它。

以下是历史表的结构。

Structure of history table

现在我们在系统中有两个表单。 2号和4号。 因此结果历史数据应该如下所示。

Result of history table for form number 2 and 4

2 个答案:

答案 0 :(得分:1)

在MSSQL中,您可以使用函数LAG() OVER ()来获取以前的值。

WITH CT AS
(
  SELECT
       ID,
       number as submissionID, 
       'amount' as Field,
       LAG(amount) OVER (PARTITION BY number ORDER BY ID)as OldValue,
       amount as NewValue
  FROM T
) 

SELECT * FROM CT 
WHERE OldValue IS NOT NULL 
ORDER BY submissionID,ID

SQLFiddle demo

另一种方法是使用ROW_NUMBER()函数将当前记录与之前的记录连接起来,这样您就可以从上一条记录中获取所有值:

WITH CT AS
(
  SELECT
       T.*, 
       ROW_NUMBER() OVER (PARTITION BY number ORDER BY ID DESC)as RowNum
  FROM T
) 

SELECT CT.*,CT2.amount as oldValue FROM CT 
JOIN CT as CT2 on CT.Number=CT2.Number 
     AND CT.RowNum+1=CT2.RowNum
ORDER BY CT.number,CT.ID

SQLFiddle demo

答案 1 :(得分:0)

select 
  d1.number,
  'amount' as field,
  d1.amount as newValue,
  d2.amount as oldValue
from data d1 join data d2 on d1.number=d2.number and d1.id=d2.id-1
如果id有差距,

不会工作,但你可以使用行号替换id的解决方案

相关问题