Могу ли я использовать рекурсивный CTE, чтобы найти минимальную дату в «потоке» идентификаторов? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть две таблицы: ActiveContacts и CompletedContacts. ActiveContacts содержит контакты, которые не были закрыты, но могли появиться из контакта в CompletedContacts.

Мне нужно найти минимальный ContactStart для всех контактов в ActiveContacts, вплоть до первого связанного контакта в CompletedContacts, если таковой существует. Вы знаете, что достигли «корня», когда ContactID = MasterContactID.

Например, в моих данных образца:

From ActiveContacts
45227565918 --> 45130250258
From CompletedContacts
45130250258 --> 45065182801
45065182801 --> 45065111275
45065111275 --> 44987017334
44987017334 --> 44986804829
44986804829 --> 44986804829 --> 2019-02-25 07:48:00.00

В некоторых случаях ContactID будет существовать только в ActiveContact, поскольку он не был порожден другими контактами в CompletedContacts.

45562514264 --> 45562514264 --> 2019-03-27 02:44:00.000

Я думаю, что это может быть достигнуто с помощью рекурсивного CTE, но я не могу понять это правильно. Это возможно? Моя единственная другая идея - ситуация типа курсор за строкой.

Пример кода ниже.

CREATE TABLE CustServ.WF.ActiveContactsTest
(
ContactID [bigint],
MasterContactID [bigint],
ContactStart [datetime]
);

INSERT INTO CustServ.WF.ActiveContactsTest (ContactID, MasterContactID, ContactStart)
VALUES
(45227565918,45130250258,'3/8/19 17:29'),
(45547409273,45545833249,'3/26/19 19:44'),
(45547477525,45547474793,'3/26/19 22:45'),
(45547491195,45547491195,'3/26/19 23:27'),
(45562514264,45562514264,'3/27/19 2:44');


CREATE TABLE CustServ.WF.CompletedContactsTest
(
ContactID [bigint],
MasterContactID [bigint],
ContactStart [datetime]
);

INSERT INTO CustServ.WF.CompletedContactsTest (ContactID, MasterContactID, ContactStart)
VALUES
(45130250258,45065182801,'3/4/19 17:22'),   -- From 1st row in ActiveContacts
(45065182801,45065111275,'2/28/19 14:11'),
(45065111275,44987017334,'2/28/19 13:49'),
(44987017334,44986804829,'2/25/19 9:20'),
(44986804829,44986804829,'2/25/19 7:48'),

(45545833249,45510675166,'3/26/19 9:44'),   -- From 2nd row in ActiveContacts
(45510675166,44056741709,'3/25/19 9:35'),
(44056741709,45435906188,'3/21/19 18:50'),
(45435906188,45370464489,'3/20/19 17:15'),
(45370464489,45318017172,'3/18/19 15:31'),
(45318017172,45280077660,'3/14/19 13:16'),
(45280077660,45280077660,'3/12/19 13:24'),

(45547474793,45547474793,'3/26/19 22:31');  -- From 3rd row in ActiveContacts

1 Ответ

0 голосов
/ 28 марта 2019

Это беспорядок в модели данных, ссылки которой представлены в двух таблицах.Но вы можете сделать это:

with t as (
      select contactID, MasterContactID, ContactStart, 0 as isactive
      from CompletedContactsTest
      -- where contactID = MasterContactID
      union all
      select contactID, MasterContactID, ContactStart, 1 as isactive
      from ActiveContactsTest
      -- where contactID = MasterContactID
     ),
     cte as (
      select contactID, MasterContactID, ContactStart, 1 as lev, isactive
      from t
      where contactID = MasterContactID
      union all
      select t.contactID, cte.MasterContactID, cte.ContactStart, lev + 1, t.isactive
      from t join
           cte
           on t.contactID = cte.MasterContactID
      where t.contactID <> t.MasterContactID
     )
select contactid, min(contactstart)
from cte
where isactive = 1
group by contactid;

Здесь - это дб <> скрипка.

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