поиск отличительного customer_id, когда номера деталей не по одному в строке, но имеют разделитель "/" - PullRequest
0 голосов
/ 24 августа 2018

Имейте набор данных, подобный этому.

Customer_id PART_N  PART_C           TXN_ID
B123        268888  7902/7900        159
B123        12839   82900/8900       1278
B869        12839   8203/890025/7902 17890
B290        268888  62820/12839      179018

не уверен, как объединить PART_N и PART_C и найти количество (отдельный customer_id) для каждой части, та же самая часть могла бы быть в PART_N или PART_C как номер детали12839

Мне интересно получить следующую таблицу с использованием teradata

Part    COUNT(Distinct Customer id)
268888  2
12839   3
7902    2
7900    1
82900   1
8900    1
8203    1
890025  1
62820   1

, если бы это была просто PART_N, то это было бы просто, поскольку в каждой строке присутствует только один номер детали.Не знаю, как мне объединить каждый номер детали и выяснить, сколько у каждого клиента уникального идентификатора.Если это поможет, у меня есть весь список отдельных номеров деталей в одной таблице, скажем, table2.

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Это довольно уродливо.

Сначала давайте разделим эти разделенные строки, используя strtok_split_to_table.

create volatile table vt_split as (
select
txn_id,
token as part
from table
    (strtok_split_to_table(your_table.txn_id,your_table.part_c,'/')
    returns (txn_id integer,tokennum integer,token varchar(10))) t
)
with data
primary index (txn_id)
on commit preserve rows;

Это даст вам все эти разделенные части с соответствующим txn_id.Затем мы можем объединить это со значениями part_n.

create volatile table vt_merged as  (
select * from vt_split
UNION ALL
select
txn_id,
cast(part_n as varchar(10)) as part
from
vt_foo)
with data
primary index (txn_id)
on commit preserve rows;

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

select
    vt_merged.part,
    count (distinct yourtable.customer_id)
from
vt_merged
inner join yourtable
    on vt_merged.txn_id = yourtable.txn_id
group by 1

Это можетвозможно, сделано немного чище, но это должно дать вам то, что вы ищете.

0 голосов
/ 26 августа 2018

Это псевдокод @ 1001 * @ S-Man в качестве рабочего запроса:

WITH cte AS
 (
   SELECT Customer_id,
      Trim(PART_N) ||'/' || PART_C AS all_parts
   FROM tab
 )
SELECT
   part, -- if part should be numeric: Cast(part AS INT) 
   Count(DISTINCT Customer_id)
FROM TABLE (StrTok_Split_To_Table(cte.Customer_id, cte.all_parts, '/')
     RETURNS (Customer_id VARCHAR(10), tokennum INTEGER, part VARCHAR(30))) AS t
GROUP BY 1
0 голосов
/ 24 августа 2018

Я не могу не попробовать этот код, поэтому считаю его псевдокодом и наброском идеи.

SELECT numbers, COUNT(numbers)
FROM
    (SELECT 
        REGEXP_SPLIT_TO_TABLE(             -- B
            CONCAT(PART_N, '/', PART_C),   -- A
            '/'
        ) as numbers
    FROM table) s
GROUP BY numbers                           -- C

A: Объединение обоих столбцов в одну строку, разделенное разделителем '/'

B: Разделить строку по разделителю

C: Группировать части строки и считать их

http://www.teradatawiki.net/2014/05/regular-expression-functions.html

...