我有一些如下所示的数据。
问题是,我必须根据数字来计算历史。假设数字是提交表格的唯一标识"。每当任何列的值发生变化时,我都必须提取它。
以下是历史表的结构。
现在我们在系统中有两个表单。 2号和4号。 因此结果历史数据应该如下所示。
答案 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
另一种方法是使用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
答案 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的解决方案