Связывание связанных идентификаторов через два других столбца идентификаторов - PullRequest
0 голосов
/ 29 мая 2020

У меня есть таблица из примерно 100 тыс. Строк со следующим макетом:

+----+-----------+------------+-------------------+
| ID |    PIN    |    RAID    | Desired Output ID |
+----+-----------+------------+-------------------+
|  1 | 80602627  | 1737852-1  |                 1 |
|  2 | 80602627  | 34046655-1 |                 1 |
|  3 | 351418172 | 33661      |                 2 |
|  4 | 351418172 | 33661      |                 2 |
|  5 | 351418172 | 33661      |                 2 |
|  6 | 351418172 | 34443321-1 |                 2 |
|  7 | 491863017 | 26136      |                 3 |
|  8 | 491863017 | 34575      |                 3 |
|  9 | 491863017 | 34575      |                 3 |
| 10 | 661254727 | 26136      |                 3 |
| 11 | 661254727 | 26136      |                 3 |
| 12 | NULL      | 7517       |                 4 |
| 13 | NULL      | 7517       |                 4 |
| 14 | NULL      | 7517       |                 4 |
| 15 | NULL      | 7517       |                 4 |
| 16 | NULL      | 7517       |                 4 |
| 17 | 554843813 | 33661      |                 2 |
| 18 | 554843813 | 33661      |                 2 |
+----+-----------+------------+-------------------+

Столбец ID имеет уникальные значения, причем столбцы PIN и RAID представляют собой два отдельных идентификационных номера, используемых для группировки связанных идентификаторов вместе. Столбец Desired Output ID - это то, что я хотел бы сделать SQL, по сути, глядя на столбцы PIN и RAID, чтобы определить, где между ними есть какие-либо отношения.

Так, например, Where Desired Output ID = 2 , Идентификаторы 3-6 совпадают с PIN-кодом = 351418172, а затем идентификаторы 17-18 также совпадают, поскольку RAID 33661 был в строках для идентификаторов 3-5.

Чтобы добавить, NULL будут в Столбец PIN, но не в других.

Я заметил похожий вопрос Текст , однако, поскольку он находится в BigQuery, я не был уверен, что это поможет.

Пытались взломать это какое-то время безуспешно, любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 03 июня 2020

Я считаю, что нашел немного удобное решение этой проблемы. Он работает очень медленно, поскольку идет строка за строкой и будет иметь только go две ссылки на PIN / RAID, но этого должно быть достаточно для 99% + случаев.

Буду признателен за любые предложения по ускорению, если все сразу становится очевидным.

ID в сообщении выше - DebtorNo in Code:

DECLARE     @Counter INT = 1
DECLARE     @EndCounter INT = 0

IF OBJECT_ID('Tempdb..#OrigACs') IS NOT NULL 
BEGIN 
DROP TABLE  #OrigACs
END 

SELECT      DebtorNo,
            Name,
            PostCode,
            DOB,
            RAJoin,
            COALESCE(PIN,DebtorNo COLLATE DATABASE_DEFAULT) AS PIN,
            RelatedAssets,
            RAID,
            PINRelatedAssets

INTO        #OrigACs

FROM        MIReporting..HC_RA_Test_Data RA

IF OBJECT_ID('Tempdb..#Accounts') IS NOT NULL 
BEGIN 
DROP TABLE  #Accounts
END 

SELECT      *,
            ROW_NUMBER() OVER (ORDER BY CAST(RA.DebtorNo AS INT)) AS Row

INTO        #Accounts

FROM        #OrigACs RA

ORDER BY    CAST(RA.DebtorNo AS INT)

CREATE INDEX Temp_HC_Index ON #OrigACs (RAID,PIN)

SET         @EndCounter = (SELECT MAX(Row) FROM #Accounts)

WHILE       @Counter <= @EndCounter 

BEGIN

IF OBJECT_ID('Tempdb..#RAID1') IS NOT NULL 
BEGIN 
DROP TABLE  #RAID1
END 

SELECT      *

INTO        #RAID1

FROM        #OrigACs A

WHERE       A.RAID IN (SELECT RAID FROM #Accounts WHERE [Row] = @Counter)

IF OBJECT_ID('Tempdb..#PIN1') IS NOT NULL 
BEGIN 
DROP TABLE  #PIN1
END 

SELECT      *

INTO        #PIN1

FROM        #OrigACs A

WHERE       A.PIN IN (SELECT PIN FROM #RAID1)

IF OBJECT_ID('Tempdb..#RAID2') IS NOT NULL 
BEGIN 
DROP TABLE  #RAID2
END 

SELECT      *

INTO        #RAID2

FROM        #OrigACs A

WHERE       A.RAID IN (SELECT RAID FROM #PIN1)

IF OBJECT_ID('Tempdb..#PIN2') IS NOT NULL 
BEGIN 
DROP TABLE  #PIN2
END 

SELECT      *

INTO        #PIN2

FROM        #OrigACs A

WHERE       A.PIN IN (SELECT PIN FROM #RAID2)

INSERT INTO MIReporting..HC_RA_Final_ACs

SELECT      DebtorNo,
            Name,
            PostCode,
            DOB,
            RAJoin,
            CASE
                WHEN PIN = DebtorNo COLLATE DATABASE_DEFAULT THEN NULL
                ELSE PIN
            END AS PIN,
            RelatedAssets,
            RAID,
            PINRelatedAssets,
            COALESCE((SELECT MAX(FRAID) FROM MIReporting..HC_RA_Final_ACs),0) + 1 AS FRAID

FROM        #PIN2

SET         @Counter = (SELECT MIN([ROW]) FROM #Accounts O WHERE O.DebtorNo NOT IN (SELECT DebtorNo FROM MIReporting..HC_RA_Final_ACs));

END;

SELECT      *

FROM        MIReporting..HC_RA_Final_ACs

DROP TABLE  #OrigACs
DROP TABLE  #Accounts
DROP TABLE  #RAID1
DROP TABLE  #PIN1
DROP TABLE  #RAID2
DROP TABLE  #PIN2
0 голосов
/ 29 мая 2020

Полагаю, DENSE_RANK может решить вашу проблему. Не уверен, какой должна быть комбинация PIN-кода и RAID, но я думаю, вы сможете понять, как это сделать, вот так:

SELECT *,DENSE_RANK( )  over (ORDER BY isnull(pin,id) ),DENSE_RANK( )  over (ORDER BY raid)
FROM accounts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...