当零件号不是每行一个但有定界符“ /”时,查找不同的customer_id

时间:2018-08-24 20:21:23

标签: sql teradata

具有与此类似的数据集。

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,那么它将很简单,因为每行只有一个零件编号。不确定如何组合每个零件号,并找出每个零件有多少个不同的客户ID。如果有帮助,我可以在一张表中列出所有不同零件编号的列表,例如table2。

3 个答案:

答案 0 :(得分:0)

我无法尝试使用此代码,因此将其视为伪代码和构思草图。

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

答案 1 :(得分:0)

这很丑。

首先,让我们使用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

这也许可以做得更干净一些,但它可以为您提供所需的东西。

答案 2 :(得分:0)

这是@ S-Man的pseudocode作为工作查询:

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