add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE test (c1 TEXT, c2 TEXT, c3 INT);
INSERT INTO test VALUES
('A','X',1),
('A','Y',2),
('B','X',3),
('B','Y',4),
('C','Z',5),
('D','X',6);
SELECT * FROM test;
c1 c2 c3
A X 1
A Y 2
B X 3
B Y 4
C Z 5
D X 6
WITH RECURSIVE cte AS
( SELECT c1, c2, c3, 1 level
FROM test
UNION ALL
SELECT cte.c1, t2.c2, GREATEST(cte.c3, t2.c3), level+1
FROM cte
JOIN test t1 ON cte.c2 = t1.c2
JOIN test t2 ON t1.c1 = t2.c1
WHERE t2.c3 != cte.c3
AND level < ( SELECT MAX(c3)
FROM test )
UNION ALL
SELECT t2.c1, cte.c2, GREATEST(cte.c3, t2.c3), level+1
FROM cte
JOIN test t1 ON cte.c1 = t1.c1
JOIN test t2 ON t1.c2 = t2.c2
WHERE t2.c3 != cte.c3
AND level < ( SELECT MAX(c3)
FROM test )
)
SELECT cte.c1, cte.c2, MAX(cte.c3) c3
FROM cte
JOIN test ON (cte.c1, cte.c2) = (test.c1, test.c2)
GROUP BY c1, c2
HAVING c3 = MAX(test.c3);
c1 c2 c3
C Z 5
D X 6