如何获取 sql 中某个值的最后更新值

How to get the last updated value of a value in sql

sample data 我有 2 列 old_store_id、changed_new_store_id 并且在某些情况下 changed_new_store_id 值也会更新为新值。我如何遍历 DB(teradata) 以获取各自 old_store_id

的最后一个值 (changed_new_store_id )

假设在第一行 old_store_id =一个; changed_new_store_id = B

第 5 行包含

old_store_id = B ; changed_new_store_id = C

还有一些其他的第n行C被更改为X等

如何得到 A 的最终值 X?

我可以尝试使用多个自连接

使用存储过程,但这不是一种有效的方法(出于多种原因) 有什么办法可以找到吗? 请任何人推荐我

递归答案:

CREATE VOLATILE TABLE #SearchList (
    SearchID       CHAR(2),
    ParentSearchID CHAR(2)
)
PRIMARY INDEX(SearchID)
ON COMMIT PRESERVE ROWS;

INSERT INTO #SearchList VALUES ('A', 'B');
INSERT INTO #SearchList VALUES ('D', 'c');
INSERT INTO #SearchList VALUES ('B', 'F');
INSERT INTO #SearchList VALUES ('c', 'FF');
INSERT INTO #SearchList VALUES ('FF', 'GG');
INSERT INTO #SearchList VALUES ('F', 'X');

CREATE VOLATILE TABLE #IntermediateResults( 

    SearchID       CHAR(2),
    ParentSearchID CHAR(2),
    SearchLevel    INTEGER
)
ON COMMIT PRESERVE ROWS;

INSERT INTO #IntermediateResults
WITH RECURSIVE RecursiveParent(SearchID,ParentSearchID,SearchLevel)
AS
(
--Seed Query
SELECT      SearchID 
            ,ParentSearchID 
            ,1

  FROM      #SearchList

UNION ALL

--Recursive Join
SELECT      a.SearchID  
            ,b.ParentSearchID
            ,SearchLevel+1

  FROM      #SearchList a 

            INNER JOIN RecursiveParent b
            ON a.ParentSearchID = b.SearchID 
)
SELECT      SearchID
            ,ParentSearchID
            ,MAX(SearchLevel)

  FROM      RecursiveParent

GROUP BY    SearchID
            ,ParentSearchID
;

SELECT      RESULTS.*

  FROM      #IntermediateResults RESULTS

            INNER JOIN (SELECT      RESULTS_MAX.SearchID
                                    ,MAX(RESULTS_MAX.SearchLevel) MaxSearchLevel

                          FROM      #IntermediateResults RESULTS_MAX

                        GROUP BY    RESULTS_MAX.SearchID
                       ) GROUPED_RESULTS
            ON RESULTS.SearchID = GROUPED_RESULTS.SearchID
            AND RESULTS.SearchLevel = GROUPED_RESULTS.MaxSearchLevel

ORDER BY     RESULTS.SearchID    ASC
            ,RESULTS.SearchLevel ASC
;

输出:

SearchID  ParentSearchID  SearchLevel
--------  --------------  -----------
A         X               3
B         X               2
c         GG              2
D         GG              3
F         X               1
FF        GG              1

这假定没有 "loops",并使用 "bottom-up" 递归。可以做一些非常相似的事情 "top-down",将种子查询限制为 "old" 值没有作为 "new" 值出现在任何地方的行。

CREATE VOLATILE TABLE #Example (
    Old_Store_ID VARCHAR(8),
    New_Store_ID VARCHAR(8)
)
PRIMARY INDEX(Old_Store_ID)
ON COMMIT PRESERVE ROWS;

INSERT INTO #Example VALUES ('A', 'B');
INSERT INTO #Example VALUES ('D', 'c');
INSERT INTO #Example VALUES ('B', 'F');
INSERT INTO #Example VALUES ('c', 'FF');
INSERT INTO #Example VALUES ('FF', 'GG');
INSERT INTO #Example VALUES ('F', 'X');

WITH RECURSIVE #Traverse(Old_Store_ID,New_Store_ID,Final_ID)
AS
(
--Seed Query - start with only the rows having no further changes
SELECT      Old_Store_ID 
            ,New_Store_ID 
            ,New_Store_ID as Final_ID

  FROM      #Example as This
  WHERE NOT EXISTS (
      SELECT 1 FROM #Example AS Other WHERE This.New_Store_ID = Other.Old_Store_ID
      )

UNION ALL

--Recursive Join
SELECT      NewRow.Old_Store_ID  
            ,NewRow.New_Store_ID
            ,OldRow.Final_ID

  FROM      #Example AS NewRow 
            INNER JOIN #Traverse AS OldRow
            ON NewRow.New_Store_ID = OldRow.Old_Store_ID 
)
SELECT *
  FROM      #Traverse
  ;