首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用SQL Server (TSQL)根据前面的行值更改/版本历史记录生成记录

如何使用SQL Server (TSQL)根据前面的行值更改/版本历史记录生成记录
EN

Stack Overflow用户
提问于 2019-05-14 00:16:21
回答 1查看 75关注 0票数 2

我有一个表格,我需要根据记录的插入和每天的更新来维护记录版本控制。"RecordVersion“表如下所示:

代码语言:javascript
复制
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

“日历”表看起来像这样:

代码语言:javascript
复制
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表:

  1. On 1-5-19,Record R1和R2
  2. On 2-5-19,插入了一个新的记录R3并更新了现有的R2 (R1保持不变)。因此,对于新的“插入”和“更新”操作,在5月19日和4月19日生成了新的版本号
  3. 未做任何更改在5月19日生成了版本记录
  4. 在5月19日再次生成了新的“插入”和“更新”因此创建了两个版本

输出(VersionHistory)应如下所示:

代码语言:javascript
复制
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版本是:

代码语言:javascript
复制
Microsoft SQL Azure (RTM) - 12.0.2000.8
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-14 05:52:31

这是我的初始数据:

代码语言:javascript
复制
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')
;

代码:

代码语言:javascript
复制
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
;

然而,它也返回日期6,不确定它是否可以。请让我知道。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56116243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档