Sql server 如何使用SQL Server(TSQL)基于前面的行值更改/版本历史生成记录
我有一个表,需要根据记录插入和每天更新来维护记录版本控制。“RecordVersion”表如下所示:Sql server 如何使用SQL Server(TSQL)基于前面的行值更改/版本历史生成记录,sql-server,tsql,azure-sql-database,azure-sql-server,Sql Server,Tsql,Azure Sql Database,Azure Sql Server,我有一个表,需要根据记录插入和每天更新来维护记录版本控制。“RecordVersion”表如下所示: VersionID RecordID RecordValue DateID (FK Calendar) --------- -------- ----------- ------ 1 R1 50 1 2 R2 60 1 3
VersionID RecordID RecordValue DateID (FK Calendar)
--------- -------- ----------- ------
1 R1 50 1
2 R2 60 1
3 R3 100 2
4 R2 80 2
5 R3 150 5
6 R4 200 5
“日历”表如下所示:
DateID Date
------ --------
1 1-May-19
2 2-May-19
3 3-May-19
4 4-May-19
5 5-May-19
6 6-May-19
如何填充RecordVersion表:
DateID VersionID RecordID RecordValue
1 1 R1 50 --Initial Record
1 2 R2 60
2 1 R1 50 -- Non Versioned
2 4 R2 80 -- Versioned for Update (50>80)
2 3 R3 100 -- New Insert
3 1 R1 50 |
3 4 R2 80 --- No Change -- Just Replicate Prev.
3 3 R3 100 |
4 1 R1 50 |
4 4 R2 80 --- No Change -- Just Replicate Prev.
4 3 R3 100 |
5 1 R1 50 -- Non Versioned
5 4 R2 80 -- Non Versioned
5 5 R3 150 -- Versioned for Update (100>150)
5 6 R4 200 -- New Insert
DateID VersionID RecordID RecordValue
1 1 R1 50 --Initial Record
1 2 R2 60
2 1 R1 50 -- Non Versioned
2 4 R2 80 -- Versioned for Update (50>80)
2 3 R3 100 -- New Insert
3 1 R1 50 |
3 4 R2 80 --- No Change -- Just Replicate Prev.
3 3 R3 100 |
4 1 R1 50 |
4 4 R2 80 --- No Change -- Just Replicate Prev.
4 3 R3 100 |
5 1 R1 50 -- Non Versioned
5 4 R2 80 -- Non Versioned
5 5 R3 150 -- Versioned for Update (100>150)
5 6 R4 200 -- New Insert
如果有人能使用TSQL生成上述输出,那就太好了。我的SQLServer版本是:
Microsoft SQL Azure (RTM) - 12.0.2000.8
这是我的初始数据:
DECLARE @RecordVersion TABLE (VersionID INT, RecordID VARCHAR(5), RecordValue INT, DateID INT);
INSERT INTO @RecordVersion(VersionID,RecordID,RecordValue,DateID)VALUES
(1,'R1',50,1)
,(2,'R2',60,1)
,(3,'R3',100,2)
,(4,'R2',80,2)
,(5,'R3',150,5)
,(6,'R4',200,5)
;
DECLARE @Calendar TABLE (DateID INT, [Date] DATE);
INSERT INTO @Calendar (DateID,[Date])VALUES
(1,'2019-05-01')
,(2,'2019-05-02')
,(3,'2019-05-03')
,(4,'2019-05-04')
,(5,'2019-05-05')
,(6,'2019-05-06')
;
守则:
SELECT b.DateID,b.VersionID,b.RecordID,b.RecordValue
FROM (
SELECT c.DateID,a.VersionID,a.RecordID,a.RecordValue
,ROW_NUMBER()OVER(PARTITION BY c.DateID,a.RecordID ORDER BY a.DateID DESC) AS [rn]
FROM @Calendar c
INNER JOIN (
SELECT v.DateID,d.[Date],v.VersionID,v.RecordID,v.RecordValue
FROM @RecordVersion v
INNER JOIN @Calendar d ON d.DateID = v.DateID
) a ON a.[Date] <= c.[Date]
) b
WHERE b.rn = 1
ORDER BY b.DateID,b.VersionID
;
选择b.DateID、b.VersionID、b.RecordID、b.RecordValue
从(
选择c.DateID、a.VersionID、a.RecordID、a.RecordValue
,ROW_NUMBER()(按c.DateID划分,按a.DateID DESC划分a.RecordID顺序)为[rn]
来自@Calendar c
内连接(
选择v.DateID,d.[Date],v.VersionID,v.RecordID,v.RecordValue
来自@RecordVersion v
内部联接@Calendar d ON d.DateID=v.DateID
)a在[日期]你需要提供一些你尝试过的努力的例子。请提供你尝试过的,你很可能会得到更快的响应。嗨,维塔利·鲍里索夫,它像一个符咒一样工作!!非常感谢。