查询写入最新更改的客户 ID

Query to write latest changed customer id

定期更新客户 id。有一个 table 记录了这个变化。

Customer id, Customer’s Previous id, Customer’s Successor id
100,95,102
101,96,105
102,100,104
103,99,106
107,88,111

我们需要从每个客户 id 的数据中获取最新更改的客户 id。一个样本来自 以上数据为:

Customer id, Latest Customer id
100,104
101,105
102,104
103,106
107,111

这是使用递归 cte 的一种方法:

with cte(customer_id, next_customer_id, lvl) as (
    select customer_id, next_customer_id, 0
    from mytable t
    where not exists (select 1 from mytable t1 where t1.customer_id = t.prev_customer_id)
    union all
    select c.customer_id, t.next_customer_id, lvl + 1
    from cte c
    inner join mytable t on t.customer_id = c.next_customer_id
)
select * 
from cte c
where lvl = (select max(c1.lvl) from cte c1 where c1.customer_id = c.customer_id)
order by customer_id

CTE 的锚点选择不存在 "previous" 记录的记录;然后,递归成员将关系推向 "next" 记录。最后,外部查询筛选每个客户的 "last" 值。

Demo on DB Fiddle:

customer_id | next_customer_id | lvl
----------: | ---------------: | --:
        100 |              104 |   1
        101 |              105 |   0
        103 |              106 |   0
        107 |              111 |   0

请注意元组 (102,104) 没有显示在结果集中,因为它实际上属于客户 100 的层次结构,其路径为 100 > 102 > 104.

如果 ID 只更新一次

,您也可以使用 LEFT JOIN
SELECT A.CID,COALESCE(B.SCID,A.SCID) AS LCID
FROM #TABLEA A LEFT JOIN #TABLEA B ON A.CID=B.PCID

CHECK DEMO HERE

输出

+---------------+-------------------+
| Customer ID   | Latest Customer id|
+---------------+-------------------+
| 100           | 104               |
| 101           | 105               |
| 102           | 104               |
| 103           | 106               |
| 107           | 111               |
+---------------+-------------------+

注意:这里我引用客户 ID 为 CID,上一个客户 ID 为 PCID,后续客户 ID 为 SCID