映射两个数字列

时间:2018-10-08 06:41:15

标签: sql postgresql

我的数据集有两个数字列,如下所示:

促销卡

12       
12       
11       
11    

付款卡

33  
44  
33  
55  

数据显示使用促销卡和支付卡进行交易的人。

在前两行中,促销卡是相同的(12),但是已使用两张不同的支付卡(33&44)进行了支付,表明它是客户编号。 1(说)。

在第三行中,使用了不同的促销卡(11),但是付款是通过之前使用过的(33)卡以及不同的促销卡(12)进行的-表示这是同一位客户(客户1号)。

目标是将所有这些行映射到一个自生成的客户ID-本质上表明所有行都属于同一客户。

这是使用PostgreSQL完成的。任何帮助或建议,我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

免责声明:我认为您的想法不周到。因为实际上,这些卡始终是别人借用的。想想一个向他的朋友借用促销卡的人。他将促销卡与信用卡一起使用。现在,该信用卡已由朋友的妻子使用,该妻子拥有她朋友的促销卡。这可能是一个永无止境的故事,您肯定会跟踪许多不同的用户。


demo: db<>fiddle

仅对于将数据插入到空表或已经填充的表中,您可以这样操作:

创建假定的表:

CREATE TABLE transactions (
    id_promo int,
    id_credit int,
    id_customer int
);

创建一个用于计算id_customer的序列:

CREATE SEQUENCE seq_transaction_id_customer;

创建触发功能:此功能检查是否已经有一个具有相同促销或信用卡号的客户。在那种情况下,给出相应的ID。否则,SELECT将是NULLCOALESCE将在SEQUENCE的帮助下生成一个新ID。

CREATE OR REPLACE FUNCTION set_id_customer() RETURNS trigger AS
$BODY$
DECLARE
    _customer_id int;
BEGIN
    SELECT DISTINCT id_customer 
    FROM transactions 
    WHERE NEW.id_promo = id_promo OR NEW.id_credit = id_credit
    INTO _customer_id;

    NEW.id_customer = COALESCE(_customer_id, nextval('seq_transaction_id_customer'));

    RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

创建每次插入新数据集时都会调用该函数的触发器。

CREATE TRIGGER transaction_id_customer
    BEFORE INSERT
    ON transactions
    FOR EACH ROW
    EXECUTE PROCEDURE set_id_customer();

如果表的行数很多,我建议为id_promoid_credit添加一个索引。这样一来,搜索现有id_customer的性能就会大大提高:

CREATE INDEX idx_transaction_promo
ON transaction(id_promo);

CREATE INDEX idx_transaction_credit
ON transaction(id_credit);

要更新现有表以创建客户的ID,您可以使用一个遍历所有数据集的函数。原则上,它应该看起来像触发函数。