Как получить последнее обновленное значение значения в sql - PullRequest
0 голосов
/ 01 июля 2019

пример данных У меня есть 2 столбца old_store_id, updated_new_store_id, и есть случаи, когда значение updated_new_store_id также будет обновлено до нового значения.как я могу пройти через DB (teradata), чтобы получить последнее значение (updated_new_store_id) соответствующего old_store_id

скажем, в 1-й строке old_store_id = A;updated_new_store_id = B

, а 5-я строка содержит

old_store_id = B;change_new_store_id = C

и некоторые другие n-ые строки C заменены на X и т. д.

как получить окончательное значение A, равное X?

Я могу попробовать использовать несколько самостоятельных объединений

с использованием хранимой процедуры, но это не будет эффективным способом (по многим причинам). Есть ли способ найти?Пожалуйста, кто-нибудь предложить мне

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Предполагается, что нет «петель», и используется «восходящая» рекурсия. Нечто подобное можно сделать «сверху вниз», ограничив начальный запрос строками, в которых «старое» значение нигде не отображается как «новое» значение.

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
  ;
0 голосов
/ 02 июля 2019

рекурсивный ответ:

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
...