TSQL-从另一个表中ID的最大值更新

TSQL-从另一个表中ID的最大值更新,tsql,sql-update,Tsql,Sql Update,我需要一些帮助,以最佳方式实现以下目标: 源表: tbl_ID name Row_id change_time 1 test1 1 2016-01-01 09:00:00 1 test2 2 2016-01-01 10:00:00 50 test3 3 2016-02-01 09:00:00 50 test4 4 2016-02-0

我需要一些帮助,以最佳方式实现以下目标:

源表:

tbl_ID  name    Row_id  change_time
1       test1   1             2016-01-01 09:00:00
1       test2   2             2016-01-01 10:00:00
50      test3   3             2016-02-01 09:00:00
50      test4   4             2016-02-01 11:00:00
66      test50  5             2016-03-01 11:00:00
目标表:

tbl_ID  name    Row_id   RecordStatus
1       test1   1         Expired
1       test2   2         Expired ----need to update this to  'New Record'
50      test3   3         Expired
50      test4   4         Expired ---- need to update this to  'New Record'
66      test50  5         Expired ---- need to update this to  'New Record'        
我需要通过以下方式连接到源表,用“新记录”更新目标表记录状态列:

  • 待定ID
  • 行id列
其中“更改时间”是每个ID的最大值

如果您对代码有任何建议,我将不胜感激。

这应该可以做到:

样本数据:

CREATE TABLE #temp(tbl_ID      INT,
                name        VARCHAR(50),
                Row_id      INT,
                change_time DATETIME);

INSERT INTO #temp
VALUES
      (1, 'test1', 1, '2016-01-01 09:00:00'),
      (1, 'test2', 2, '2016-01-01 10:00:00'),
      (50, 'test3', 3, '2016-02-01 09:00:00'),
      (50, 'test4', 4, '2016-02-01 11:00:00'),
      (66, 'test50', 5, '2016-03-01 11:00:00');

CREATE TABLE #temp2(tbl_ID       INT,
                name         VARCHAR(50),
                Row_id       INT,
                RecordStatus VARCHAR(50));

INSERT INTO #temp2
VALUES
      (1, 'test1', 1, 'Expired'),
      (1, 'test2', 2, 'Expired'), ----need to update this to  'New Record'
      (50, 'test3', 3, 'Expired'),
      (50, 'test4', 4, 'Expired'), ---- need to update this to  'New Record'
      (66, 'test50', 5, 'Expired');  ---- need to update this to  'New Record' 
查询:

;WITH A
    AS (SELECT *,
             RANK() OVER(PARTITION BY tbl_ID ORDER BY change_time) AS Ranking
        FROM   #temp),
    B
    AS (SELECT A.*
        FROM   A
             INNER JOIN
                     (SELECT tbl_ID,
                            MAX(Ranking) Ranking
                      FROM   A
                      GROUP BY tbl_ID) AS B ON A.tbl_ID = B.tbl_ID
                                          AND A.Ranking = B.Ranking)
    UPDATE A
      SET  A.RecordStatus = 'New Record'
    FROM #temp2 AS A
        INNER JOIN B B ON A.tbl_ID = B.tbl_ID
                       AND A.Row_id = B.Row_id;
结果:

SELECT *
FROM   #temp2;

这应该可以做到:

样本数据:

CREATE TABLE #temp(tbl_ID      INT,
                name        VARCHAR(50),
                Row_id      INT,
                change_time DATETIME);

INSERT INTO #temp
VALUES
      (1, 'test1', 1, '2016-01-01 09:00:00'),
      (1, 'test2', 2, '2016-01-01 10:00:00'),
      (50, 'test3', 3, '2016-02-01 09:00:00'),
      (50, 'test4', 4, '2016-02-01 11:00:00'),
      (66, 'test50', 5, '2016-03-01 11:00:00');

CREATE TABLE #temp2(tbl_ID       INT,
                name         VARCHAR(50),
                Row_id       INT,
                RecordStatus VARCHAR(50));

INSERT INTO #temp2
VALUES
      (1, 'test1', 1, 'Expired'),
      (1, 'test2', 2, 'Expired'), ----need to update this to  'New Record'
      (50, 'test3', 3, 'Expired'),
      (50, 'test4', 4, 'Expired'), ---- need to update this to  'New Record'
      (66, 'test50', 5, 'Expired');  ---- need to update this to  'New Record' 
查询:

;WITH A
    AS (SELECT *,
             RANK() OVER(PARTITION BY tbl_ID ORDER BY change_time) AS Ranking
        FROM   #temp),
    B
    AS (SELECT A.*
        FROM   A
             INNER JOIN
                     (SELECT tbl_ID,
                            MAX(Ranking) Ranking
                      FROM   A
                      GROUP BY tbl_ID) AS B ON A.tbl_ID = B.tbl_ID
                                          AND A.Ranking = B.Ranking)
    UPDATE A
      SET  A.RecordStatus = 'New Record'
    FROM #temp2 AS A
        INNER JOIN B B ON A.tbl_ID = B.tbl_ID
                       AND A.Row_id = B.Row_id;
结果:

SELECT *
FROM   #temp2;