Hello Everyone and thank you in advance for the help.
I have setup a correspondance table that looks like this
Old | New |
---|---|
A | B |
B | C |
A | D |
C | D |
Of course this is a log of correspondance between one state to another at multiple points in time. I am trying to transform this data into a "usable format" by flattening out the relationships between old and new to get to something like this:
Old | New |
---|---|
A | D |
B | D |
C | D |
Does anyone have any idea how to do something like this in SQL? Please keep in mind the iterations can run 7 levels deep. Thank you very much
CodePudding user response:
Use a recursive CTE:
WITH cte AS (
SELECT old, new, 1 level FROM tablename
UNION ALL
SELECT c.old, t.new, level 1
FROM tablename t INNER JOIN cte c
ON c.new = t.old
)
SELECT DISTINCT old,
FIRST_VALUE(new) OVER (PARTITION BY old ORDER BY level DESC) new
FROM cte
ORDER BY old;
See the demo.