Запрос на запись последнего измененного идентификатора клиента - PullRequest
0 голосов
/ 02 марта 2020

Клиент 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

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Вот один из способов сделать это с помощью рекурсивного 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 выбирает записи, для которых не существует «предыдущей» записи; затем рекурсивные члены переходят отношения к «следующим» записям. Наконец, внешний запрос фильтрует «последнее» значение для каждого клиента.

Демонстрация на 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.

0 голосов
/ 02 марта 2020

Вы также можете использовать LEFT JOIN, если ID обновляется только один раз

SELECT A.CID,COALESCE(B.SCID,A.SCID) AS LCID
FROM #TABLEA A LEFT JOIN #TABLEA B ON A.CID=B.PCID

ПРОВЕРЬТЕ ДЕМО ЗДЕСЬ

Выход

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

Примечание. Здесь я сослался на идентификатор клиента в качестве CID, идентификатор предыдущего клиента в качестве PCID и идентификатор клиента-преемника в качестве SCID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...