Как создавать пары из таблицы - PullRequest
1 голос
/ 01 июля 2019

У меня есть таблица Hive, в которой данные выглядят так -

enter image description here

У каждого клиента есть соответствующие счета, и цель состоит в том, чтобы создать пару внутри клиента,Пары основаны на том, имеют ли учетные записи один и тот же год рождения или их первые 3 имени одинаковы.Например, Сэм и Сэмюэль.

Вывод выглядит так - enter image description here

В идеале не должна создаваться такая же пара счетов, как AA, XX и т. Д.Также пара AC и CA оба одинаковы, поэтому необходима только одна запись таких пар.Пара также может быть сформирована по имени и ключу года рождения, но здесь также требуется только одна запись (может быть кем угодно).

Как мне решить эту проблему.Тестовые данные для проверки -

create table customer_account(
customer INT NOT NULL,
accounts VARCHAR(100) NOT NULL,
name VARCHAR(40) NOT NULL,
yob DATE,
);

INSERT INTO 
customer_account(customer,accounts,name,yob)
VALUES
(1,"A","John",2001),
(1,"X","Tom",1996),
(1,"C","Harry",2001),
(2,"D","Sam",1994),
(2,"F","Samuel",1995),
(3,"Z","Jake",)1994,
(3,"G","Drake",1998),
(3,"H","Arnold",1993),
(3,"K","Yang",1990)
;

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Это то, что вы описываете:

select t1.*, t2.name, t2.yob
from t t1 join
     t t2
     on t2.customer = t1.customer and
        (t2.yob = t1.yob or
         substr(t2.name, 1, 3) = substr(t1.name, 1, 3)
        ) and
        t2.account > t1.account;

Нет необходимости извлекать customer дважды.Если вам нужны «идентичные» пары, измените последнее условие на >=.

1 голос
/ 01 июля 2019

Вы должны иметь возможность использовать подстроки для вашего соединения на языке HIVE.Логика должна быть разумной, хотя вам может потребоваться немного настроить ее для своих нужд.

То, что вы пытаетесь сделать, - это унарное (или самостоятельное) соединение.Ниже приведен пример типа запроса, который можно передать.По сути, вы соединяетесь с условием ИЛИ и тестируете это условие с помощью оператора case, чтобы получить "Pair_Key".Я использовал внутреннее соединение, предполагая, что вам нужны только случаи, когда происходят совпадения.

SELECT 
     t1.customer as Customer1,
     t2.customer as Customer2,
     t1.Accounts as Accounts1,
     t2.Accounts as Accounts2,
     CONCAT(t1.Accounts, t2.Accounts) as Pair_No,
     t1.Name as Name1,
     t2.Name as Name2,
     t1.YOB as YOB1,
     t2.YOB as YOB2,
     CASE
     WHEN t1.YOB = t2.YOB THEN 'YOB'
     WHEN SUBSTR(t1.Name, 3) = SUBSTR(t2.Name, 3) THEN 'Name'
     else 'Issue'
     END as Pair_Key
FROM (SELECT * FROM Table1) as t1
inner join (SELECT * FROM Table1) as t2 --instance 2 of the same table
on (SUBSTR(t1.Name, 3) = SUBSTR(t2.Name, 3) OR t1.YOB = t2.YOB)

Без тестовых данных или более подробной информации о том, как далеко вы продвинулись, это начало.

Если клиентчисло должно быть таким же, просто настройте на:

on (t1.Customer = t2.Customer) and (SUBSTR(t1.Name, 3) = SUBSTR(t2.Name, 3) OR t1.YOB = t2.YOB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...