Отображение двух числовых столбцов - PullRequest
0 голосов
/ 08 октября 2018

Мой набор данных состоит из двух числовых столбцов, как показано ниже:

промо-карта

12       
12       
11       
11    

платежная карта

33  
44  
33  
55  

Данные показывают человека, использующего промокарта с платежной картой для транзакции.

В первых двух строках промо-карта такая же (12), но оплата была произведена с использованием двух разных платежных карт (33 и 44), что указывает на то, что клиент №.1 (скажем).

В третьем ряду используется другая промо-карта (11), но оплата была произведена с помощью карты, уже использовавшейся ранее (33), вместе с другой промо-картой (12) - с указаниемчто это один и тот же клиент (клиент № 1).

Цель состоит в том, чтобы сопоставить все эти строки с самостоятельно сгенерированным идентификатором клиента - по сути, указывающим, что все строки принадлежат одному и тому же клиенту.

Это должно быть сделано с использованием PostgreSQL .. Любая помощь или предложения будут оценены!

1 Ответ

0 голосов
/ 08 октября 2018

Отказ от ответственности : Я считаю, что ваша идея не очень хорошо продумана.Потому что на самом деле карты всегда заимствованы и используются другими лицами.Подумайте о человеке, который одалживает свою промо-карту своему другу.Он использует промо-карту со своей кредитной картой.Теперь кредитная карта используется женой друга, которая имеет промо-карту своего друга.Это может быть бесконечная история, и вы определенно будете отслеживать много разных пользователей.


demo: db <> fiddle

Только для вставки данныхв пустую или уже заполненную таблицу вы можете сделать это следующим образом:

Создать предполагаемую таблицу:

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

Создать последовательность для подсчета id_customer:

CREATE SEQUENCE seq_transaction_id_customer;

Создать функцию триггера: эта функция проверяет, есть ли уже клиент с таким же промо или номером кредитной карты.В этом случае соответствующий идентификатор предоставляется.В противном случае SELECT будет NULL, а COALESCE генерирует новый идентификатор с помощью SEQUENCE.

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);

Чтобы обновить существующую таблицу для создания идентификаторов клиента, вы можете использовать функцию, которая перебирает все наборы данных.В принципе это должно выглядеть как функция триггера.

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