【问题标题】:Query to write latest changed customer id查询写入最新更改的客户 ID
【发布时间】:2020-03-02 09:56:17
【问题描述】:

Тhe 客户id 定期更新。这里有张桌子 记录此更改。

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

【问题讨论】:

  • 请说明您尝试了什么以及您遇到的问题。
  • 你可以创建一个表来存储最新的客户 ID 和最后更新日期
  • 如果您的表格中有任何日期列会更新。只需使用按日期排序。
  • 没有日期栏。只有三列
  • 这是我们编码面试中的一个问题:(

标签: sql sql-server tsql recursive-query hierarchical-query


【解决方案1】:

这是使用递归 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 的锚点选择不存在“先前”记录的记录;然后,递归成员将关系推向“下一个”记录。最后,外部查询过滤每个客户的“最后一个”值。

Demo on DB Fiddle

客户 ID | next_customer_id |等级 ----------: | ---------------: | --: 100 | 104 | 1 101 | 105 | 0 103 | 106 | 0 107 | 111 | 0

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

【讨论】:

  • @pushpakKumar 。 . .递归 CTE 是解决此问题的一般方法。
【解决方案2】:

如果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

【讨论】:

  • @PushpakKumar 。 . .这可能适用于您的示例数据,但如果随着时间的推移有多次更改,它就不起作用了。
  • @GordonLinoff ,是的,这是真的。我的印象是每个 ID 都会更新一次。现在我已经添加了注释。谢谢指出!
猜你喜欢
  • 2018-02-07
  • 2020-12-18
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多