Группировка данных и поиск общей строки - PullRequest
1 голос
/ 18 июня 2020

У меня есть общее c требование для группировки данных и получения из них общей строки. Я не уверен, какая технология будет работать для этого конкретного требования c. Следовательно, он упоминается как generi c. В настоящее время у меня есть доступ к командам SQL, Unix, SAS, MSTR, Informatica и Python.

Фактические данные:

Field A| Field B | Field c
A      | 001     | Alan J
A      | 001     | Alan Walker 
A      | 001     | Walker Alan 
A      | 001     | Alexander AlanJoseph 

Требуемый вывод:

Field A | Field B | Field C 
A       | 001     | Alan

Примечание: Основываясь на группировке полей A и B, необходимо выяснить общую закономерность среди данных в поле C

Может ли кто-нибудь помочь мне в этом?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Ниже представлено решение

Sql

select field_a, field_b, field_c from
(select distinct d1.*, row_number() over(partition by d1.field_a order by d1.field_c) 
as rnk from data d1
inner join data d2 on 
(instr(d1.field_c, d2.field_c) > 0)) where rnk=1;

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=ccd9837b8e893ed42f8ade3b7e7e9d40

Informatica

Используйте преобразование Expression, найдите шаблон с помощью функции INSTR (вы также можете использовать регулярные выражения). Затем передайте порты в преобразование ранга и отсортируйте его как field_ c и получите первые значения 1.

1 голос
/ 18 июня 2020

Добро пожаловать в SAS. Ваш вопрос можно решить разными способами, я даю вам версию DOW l oop.

data have;
    input A$ 1-3 B$ 12-15 C$ 21-43;
    cards;
    A      | 001     | Alan 
    A      | 001     | Alan Walker 
    A      | 001     | Walker Alan 
    A      | 001     | Alexander AlanJoseph
    B      | 002     | Jay 
    B      | 002     | Jay Zhou
    B      | 002     | JayJay 
;
run;

proc sort;
    by A B;
run;

data want(keep=A B C);
    length string $1024.;

    do until(last.B);
        set have;
        by A B;
        string = catx('@',string,C);
        count = sum(count,1);
    end;

    do until(last.B);
        set have;
        by A B;
        do i = 1 to count;
            if find(scan(string,i,'@'),cats(C)) then match = sum(match,1);
        end;
        if count = match then output;
    end;
run;

proc print;
run;

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