感谢,前两天忙着期末考没时间写,我照着您的代码和楼上各位数据库大神的指导差不多写出来了。感觉目前回答的思路好像都不大对,简单说说我的想法:
1. 第一个 WHERE date = '2011-12-31', 不要管他,这个给人带了很多confusion, 你可以把它当成任何一个Where Condition, 就像Where CompanyName='xxx'.
反正是得到一个DataSet, 这个时间点可以完全忽略。
2. 两个关键的时间点,第一个是ChangeDate, 像题目中的'2018-02-22 14:42:22', 是Hisotry Date, 另外一个其实是隐含的时间点,题目中没有给出了,但实际上
很重要,就是当前的时间点,CurrentTime = GetDate()
3. 所有的DataSet还是只能从主DataTable里选取,这是唯一的Source,但是主DataTable里只有当前时间点的数据,所以也要用到Audit Table.
4. 基本思路就是: SELECT * FROM dbo.data1 WHERE date = '2011-12-31', 得到当前时间点的DataSet, 然后再Revert所有的Changes between History Data between Current Time from audit Table:
分三种:Insert的必须要Exclude, Delete的要Union起来,Update的要找回原值。
SELECT * FROM dbo.data1 WHERE date = '2011-12-31' AND PrimaryID NOT IN (SELECT PrimaryID FROM data_audit_data1 WHERE date = '2011-12-31' and TriggerType='Insert' and ChangeDate > '2018-02-22 14:42:22' )
UNION
SELECT * FROM data_audit_data1 WHERE date = '2011-12-31' and TriggerType='Delete' and ChangeDate > '2018-02-22 14:42:22'
这个可以把Hisotry Data和Current Time之间的 Insert和Delete给 Revert回去,
还有一个Update的比较麻烦一点,因为同样一个PrimaryID可能会被Update几次,应该是只用最早时间的的一次Record的原值,这个部分就懒得写了,把这部分和上面的DataSet合并
,就得到你想要的结果了。
上面的所有的只是思路和抽象代码,你理解了剩下的应该很容易写出来的。
代码:
ALTER FUNCTION [dbo].[data1_PIT](@data_date smalldatetime, @as_of_date datetime)
RETURNS TABLE
AS
RETURN
(
WITH TMP_1 AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY id_security ORDER BY ChangeDate ASC) rn
FROM data_audit.data1 WHERE date = @data_date AND ChangeDate >= @as_of_date),
TMP_2 AS (SELECT * FROM TMP_1 WHERE rn = 1)
SELECT * FROM data1
WHERE date = @data_date
AND id_security NOT IN (SELECT id_security FROM TMP_2)
AND AddDate <= @as_of_date
UNION
SELECT
date,id_security,column6,column7,column10,column11,column12,column13,column14,column15,column16,column17,column18,column19,column20,column21,column22,
column23,column24,column25,column26,column27,column28,column29,column30,column31,column32,column33,column34,column35,column36,column37,column38,column39,
column40,column41,column42,column43,column44,column45,AddLoginID,AddDate,column48,column49,column50,column51,column52,column53,column54,column55,column56,
column57,column58,column59,column60,column61,column62,column64,column65,column66,column67,column68,column69,column70,column71,column72
FROM TMP_2
)