SQL - определение количества месяцев периода контракта до и после изменения контракта - PullRequest
0 голосов
/ 04 мая 2020

Мне снова нужна твоя помощь. Это о SQL утверждении, что я в растерянности.

В качестве основы у меня есть таблица с данными контракта для нескольких клиентов. В этой таблице вы можете увидеть, как долго действует контракт для клиента и есть ли какие-либо изменения в контракте с течением времени. Если что-то меняется, оно отображается как «ИСТИНА» в поле «contract_value_change».

На этом основании мне нужно рассчитать количество месяцев, которое клиент имел в договоре до и после изменения. Я ввел этот результат вручную в поле «Фактор». У вас есть идея, как я могу рассчитать это автоматически с SQL? (Я работаю с Redshift)

enter image description here

CREATE TABLE IF NOT EXISTS "TEST_CUSTOMER" (
    "Customer_no" INT,
    "Month" TEXT,
    "Current_line_no" INT,
    "contract_duration_in_month" INT,
    "contract_value" INT,
    "contract_value_before" TEXT,
    "contract_value_change" TEXT,
    "FACTOR" INT
);
INSERT INTO "TEST_CUSTOMER" VALUES
    (100,'01-2020',1,12,100,'NULL','false',4),
    (100,'02-2020',2,12,100,'100','false',4),
    (100,'03-2020',3,12,100,'100','false',4),
    (100,'04-2020',4,12,100,'100','false',4),
    (100,'05-2020',5,12,80,'100','TRUE',8),
    (100,'06-2020',6,12,80,'80','false',8),
    (100,'07-2020',7,12,80,'80','false',8),
    (100,'08-2020',8,12,80,'80','false',8),
    (100,'09-2020',9,12,80,'80','false',8),
    (100,'10-2020',10,12,80,'80','false',8),
    (100,'11-2020',11,12,80,'80','false',8),
    (100,'12-2020',12,12,80,'80','false',8),
    (20000,'01-2020',1,6,2000,'NULL','false',4),
    (20000,'02-2020',2,6,2000,'2000','false',4),
    (20000,'03-2020',3,6,2000,'2000','false',4),
    (20000,'04-2020',4,6,2000,'2000','false',4),
    (20000,'05-2020',5,6,2500,'2000','TRUE',2),
    (20000,'06-2020',6,6,2500,'2500','false',2);

1 Ответ

1 голос
/ 04 мая 2020

Вы, кажется, хотите count() в качестве оконной функции:

select c.*,
       count(*) over (partition by customer_no, contract_value) as factor
from test_customer c;

На самом деле, это, вероятно, проблема пробелов и островков - если значение контракта возвращается к ранее использованному значению, то Вы, вероятно, хотите только размер "острова". Если это так, вы можете использовать разницу номеров строк, чтобы идентифицировать «острова», а затем использовать это:

select c.*,
       count(*) over (partition by customer_no, contract_value, current_line_no - seqnum) as factor
from (select c.*,
             row_number() over (partition by customer_no, contract_value) as seqnum
      from test_customer c
     ) c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...