链接基于动态表的SQL连接

时间:2016-03-17 18:00:08

标签: sql sql-server tsql hive

标题可能不准确但问题仍然存在!我有下表:

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可能链接很多次或几次)。 id1id2之间始终存在1对1的映射。

先谢谢了!这可以在T-SQL或Hive中完成(如果有人有一个聪明的map-reduce解决方案)。

1 个答案:

答案 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