标题可能不准确但问题仍然存在!我有下表:
id1 id2 status
1 2 a
2 3 b
3 4 c
6 7 d
7 8 e
8 9 f
9 10 g
我想根据动态链加入得到第一个id1
和最后一个status
,这意味着结果表将是:
id final_status
1 c
6 g
逻辑上,我想基于将表连接到自身来构造以下数组:
id1 chained_ids chained_status
1 [2,3,4] [a,b,c]
6 [7,8,9,10] [d,e,f,g]
然后抓住chained_status
列表的最后一个元素。
因为如果我们要在id1 = id2
上继续将此表连接到自己,我们最终会有这些结果的单行。问题是连接数不是恒定的(单个id
可能链接很多次或几次)。 id1
到id2
之间始终存在1对1的映射。
先谢谢了!这可以在T-SQL或Hive中完成(如果有人有一个聪明的map-reduce解决方案)。
答案 0 :(得分:2)
您可以使用递归CTE执行此操作:
;WITH My_CTE AS
(
SELECT
id1,
id2,
status,
1 AS lvl
FROM
My_Table T1
WHERE
NOT EXISTS
(
SELECT *
FROM My_Table T2
WHERE T2.id2 = T1.id1
)
UNION ALL
SELECT
CTE.id1,
T3.id2,
T3.status,
CTE.lvl + 1
FROM
My_CTE CTE
INNER JOIN My_Table T3 ON T3.id1 = CTE.id2
)
SELECT
CTE.id1,
CTE.status
FROM
My_CTE CTE
INNER JOIN (SELECT id1, MAX(lvl) AS max_lvl FROM My_CTE GROUP BY id1) M ON
M.id1 = CTE.id1 AND
M.max_lvl = CTE.lvl