Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用SQL Server(TSQL)基于前面的行值更改/版本历史生成记录_Sql Server_Tsql_Azure Sql Database_Azure Sql Server - Fatal编程技术网

Sql server 如何使用SQL Server(TSQL)基于前面的行值更改/版本历史生成记录

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

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

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
  • 19年5月1日,插入了记录R1和R2
  • 19年5月2日,插入了新记录R3,并更新了退出R2(R1保持不变)。因此,对于新的“插入”和“更新”操作,都会生成新的版本号
  • 19年5月3日和19年5月4日未进行任何更改,未生成版本记录
  • 19年5月5日,又有一个新的“插入”和“更新”,所以两个版本被装箱
  • 输出(VersionHistory)应如下所示:

    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在[日期]你需要提供一些你尝试过的努力的例子。请提供你尝试过的,你很可能会得到更快的响应。嗨,维塔利·鲍里索夫,它像一个符咒一样工作!!非常感谢。