Войти Регистрация
Data base

238. Все записи, связанные с клиентом через id, телефон или почту

Сложная

В contacts — записи о клиентах из разных систем банка: client_id, phone, mail, любое поле может быть пустым. Две записи связаны, если у них совпадает хотя бы одно из трёх полей. Связь транзитивна: если K01 совпадает с K02 по телефону, а K02 с K03 по почте, то K01 и K03 тоже связаны.

Найдите все записи, связанные с записью K01, включая её саму. Пустые поля ничего не связывают: две записи без почты не становятся родственными. Верните rec_key, порядок — по rec_key. Если K01 в таблице нет, ответ пустой.

В работе: Склейка клиентского профиля из CRM, заявок и мобильного банка перед проверкой на мошенничество.

Таблицы

contacts — одна строка — одна запись из какой-то системы

КолонкаТипЧто значит
rec_keytextключ записи
client_idtextid клиента в системе, может быть NULL
phonetextтелефон, может быть NULL
mailtextпочта, может быть NULL

Пример: данные

contacts · 6 строк

rec_keyclient_idphonemail
K01C101+79161112233NULL
K02C101NULLanna.v@mail.ru
K03C205NULLanna.v@mail.ru
K04C309+79035550000NULL
K05C205+79260001122NULL
K06NULLNULLNULL

Ожидаемый ответ

rec_key
K01
K02
K03
K05
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 5 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
rec_key
рекурсивный CTENULLJOIN

Источник: тестовое аналитика данных (Middle) в Сбере, сборник No Data No Growth. Условие пересказано своими словами.