查找具有历史ID的最新ID

时间:2017-08-17 07:25:12

标签: sql teradata

我目前有以下情况:我有一段ID(主键)在一段时间内发生变化。在此过程中,我需要找出带有历史ID的最新ID作为参考。

例如:

Hist ID    New ID
123        234
234        345
345        456

在上面的示例数据中,123是已知的历史密钥,我需要检索当前的ID,即456.

关于如何通过sql实现这一点的任何建议都将受到高度赞赏。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用recursive queryparameterized macro来获得所需的结果。

创建macro,如下所示。

REPLACE MACRO Find_New_Id(old_id INT) AS( WITH RECURSIVE id_map(hist_id, new_id, depth) AS
  (SELECT hist_id,
          new_id,
          0
   FROM id_tbl
   WHERE hist_id = :old_id
   UNION ALL SELECT im.hist_id,
                    it.new_id,
                    depth+1
   FROM id_map im
   JOIN id_tbl it ON im.new_id = it.hist_id
   AND im.hist_id <> it.new_id)
SELECT id_m.new_id
FROM id_map id_m JOIN
  (SELECT Max(depth) AS Depth_val
   FROM id_map) AS tbl_depth
ON id_m.depth = tbl_depth.Depth_val;);

然后以Hist Id作为输入执行它(在您的情况下为123。您还可以使用任何其他hist Id,即234345)。

EXEC Find_New_Id(123);

它将生成如下结果。

new_Id
-------
456

希望这会有所帮助。

修改

在dnoeth建议之后,以下是初始查询的简单版本。

   REPLACE MACRO Find_New_Id(old_id INT) AS( WITH RECURSIVE id_map(hist_id, new_id, depth) AS
  (SELECT hist_id,
          new_id,
          0
   FROM id_tbl
   WHERE hist_id = :old_id
   UNION ALL SELECT im.hist_id,
                    it.new_id,
                    depth+1
   FROM id_map im
   JOIN id_tbl it ON im.new_id = it.hist_id
   AND im.hist_id <> it.new_id)
SELECT TOP 1 new_id
FROM id_map
ORDER BY depth DESC;);

答案 1 :(得分:0)

您可以将列添加为date_created,并在添加数据时添加日期时间。之后,您可以在表格中找到top 1 from NewID过滤器date_created DESC