我的数据集有两个数字列,如下所示:
促销卡
12
12
11
11
付款卡
33
44
33
55
数据显示使用促销卡和支付卡进行交易的人。
在前两行中,促销卡是相同的(12),但是已使用两张不同的支付卡(33&44)进行了支付,表明它是客户编号。 1(说)。
在第三行中,使用了不同的促销卡(11),但是付款是通过之前使用过的(33)卡以及不同的促销卡(12)进行的-表示这是同一位客户(客户1号)。
目标是将所有这些行映射到一个自生成的客户ID-本质上表明所有行都属于同一客户。
这是使用PostgreSQL完成的。任何帮助或建议,我们将不胜感激!
答案 0 :(得分:1)
免责声明:我认为您的想法不周到。因为实际上,这些卡始终是别人借用的。想想一个向他的朋友借用促销卡的人。他将促销卡与信用卡一起使用。现在,该信用卡已由朋友的妻子使用,该妻子拥有她朋友的促销卡。这可能是一个永无止境的故事,您肯定会跟踪许多不同的用户。
仅对于将数据插入到空表或已经填充的表中,您可以这样操作:
创建假定的表:
CREATE TABLE transactions (
id_promo int,
id_credit int,
id_customer int
);
创建一个用于计算id_customer
的序列:
CREATE SEQUENCE seq_transaction_id_customer;
创建触发功能:此功能检查是否已经有一个具有相同促销或信用卡号的客户。在那种情况下,给出相应的ID。否则,SELECT
将是NULL
,COALESCE
将在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_promo
和id_credit
添加一个索引。这样一来,搜索现有id_customer
的性能就会大大提高:
CREATE INDEX idx_transaction_promo
ON transaction(id_promo);
CREATE INDEX idx_transaction_credit
ON transaction(id_credit);
要更新现有表以创建客户的ID,您可以使用一个遍历所有数据集的函数。原则上,它应该看起来像触发函数。