Извлечение фамилии клиента из таблицы истории без отметки времени - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующие две таблицы:

клиенты:

|Customer Code|Current Customer Code|
|123456|-|
---------------
|123455|-|
---------------
|123454|-|
---------------
|123453|-|
---------------

История:

|customer Code x (current)|Customer Code y(former)|
|123456|123455|
---------------
|123455|123454|
---------------
|123454|123453|
---------------
|123453|123452|
---------------
|123452|      |

Что я хочу:

|Customer Code|Current Customer Code|

|123456|123456|
---------------
|123455|123456|
---------------
|123454|123456|
---------------
|123453|123456|
---------------

В данный момент текущий клиент неизвестен в таблице клиентов.Мне нужно извлечь текущий код клиента из таблицы истории и записать его в поле текущего клиента в таблице клиентов.

Я дошел до этого:

SELECT 
[Customer Code], [Current Customer Code] FROM customers
LEFT JOIN(
    SELECT 
    c.[Customer Code],
    t.dats
    FROM Customers c
        inner JOIN (
            SELECT [Customer Code x], [Customer Code y] FROM 
            history t
            LEFT JOIN Customers c
            ON t.bpid = c.[customer code]
       ) t
   ON c.[Customer Code] = t.[Customer Code]

Несколько замечаний:

  • Может быть несколько наборов клиентов, но эти наборы будут в историитаблица.
  • В числах могут быть скачки, например, с 12455 до 12453.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Это можно сделать с помощью рекурсивного CTE.

Мой запрос начинается со всех реальных кодов клиентов, которые не имеют более нового кода клиента в истории.Затем он рекурсивно добавляет прежние коды клиентов, используя историю (кроме пустой).

WITH
  cte (FormerCustomerCode, CurrenctCustomerCode) AS (
    SELECT actual.CustomerCode, actual.CustomerCode
    FROM customers actual
      LEFT JOIN history newer ON actual.CustomerCode = newer.CustomerCodeY
    WHERE newer.CustomerCodeY IS NULL

    UNION ALL

    SELECT older.CustomerCodeY, newer.CurrenctCustomerCode
    FROM cte newer
      INNER JOIN history older ON newer.FormerCustomerCode = older.CustomerCodeX
    WHERE older.CustomerCodeY IS NOT NULL
  )
UPDATE customers
  SET CurrenctCustomerCode = cte.CurrenctCustomerCode
FROM customers c
  INNER JOIN cte ON c.CustomerCode = cte.FormerCustomerCode;

Рекурсивный CTE создает список, подобный этому:

CTE Result

Этот список затем используется оператором UPDATE для обновления таблицы клиентов (при необходимости измените параметр MAXRECURSION).

0 голосов
/ 20 сентября 2018

[[ОТВЕТ ОБНОВЛЕНО - Для учета ОП исправлены исходные данные]]

@ В PreQL упоминается обработка данных как иерархии.

Я объявил здесь пару переменных таблицы дляпростой вырезать / вставить / проверить запрос ...

declare @customers TABLE (CustomerCode int, CurrenctCustomerCode int)

insert into @customers values (123456, null)
insert into @customers values (123455, null)
insert into @customers values (123454, null)
insert into @customers values (123453, null)

declare @history TABLE (CustomerCodeX int, CustomerCodeY int)

insert into @history values (123456, 123455)
insert into @history values (123455, 123454)
insert into @history values (123454, 123453)
insert into @history values (123453, 123452)
insert into @history values (123452, null)

Нам нужно найти точку привязки для иерархии - и мы можем сделать это с помощью подзапроса, который находит торговые идентификаторы, которые не являются«предыдущие» идентификаторы для последующих торговых идентификаторов.

   select c.* 
     from @customers c 
left join @history h 
       on c.CustomerCode = h.CustomerCodeY  
    where h.CustomerCodeX is null

Помещение подзапроса с помощью в мой оригинальный CTE выглядит примерно так:

; with cte (CCX, CCY, CCC) 
as
(

    select h1.CustomerCodeX, h1.CustomerCodeY, x.CustomerCode
    from @history h1
    join (select c.* from @customers c left join @history h on c.CustomerCode = h.CustomerCodeY  where h.CustomerCodeX is null) x
    on h1.CustomerCodeX = x.CustomerCode
    union all 
    select 
        h.CustomerCodeX,
        h.CustomerCodeY,
        cte.CCC
    from @history h
    join cte on h.CustomerCodeX = cte.CCY
)
select CCX as CustomerCode, CCC as CurrentCustomerCode from cte

Вывод:

CustomerCode CurrentCustomerCode
------------ -------------------
123456       123456
123455       123456
123454       123456
123453       123456
123452       123456

Надеюсь, это полезно.

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