поставить 1, если клиент купил в 3 следующих месяца sql помощник - PullRequest
0 голосов
/ 04 марта 2020

Я новичок с teradata SQL Помощник, и я не знаю, может ли он делать то, что мне нужно.

У меня есть база с идентификатором переменных, месяц (или период) и доходы за этот месяц. Что мне нужно, это поставить 1, если клиент покупает в ближайшие 3 месяца или 0, если нет, и сделать это для всех ID. Например, если я нахожусь в 1-м месяце, и в течение следующих 3-х месяцев есть покупка, тогда поставьте 1 в этой строке для этого клиента. В последние периоды, так как не будет 3 месяца, появляется NA.

Вот код для примеров данных:

IF OBJECT_ID('tempdb..#StackTest') IS NOT NULL
    DROP TABLE #StackTest;

CREATE TABLE #StackTest
(Id int
,Month int
,Income int
);

INSERT INTO #StackTest
(Id
,Month
,Income
)
VALUES
(1, 1, 5000),
(1, 2, 0),
(1, 3, 0),
(1',4, 0),
(1,5, 0),
(1,6, 0),
(1, 7, 400),
(1, 8, 0),
(1, 9, 0),
(1, 10, 0),
(1, 11, 0),
(1, 12, 0),
(1, 13, 400),
(2, 1, 5000),
(2, 2, 0),
(2, 3, 100),
(2,4, 0),
(2,5, 0),
(2,6, 0),
(2, 7, 0),
(2, 8, 1500),
(2, 9, 0),
(2, 10, 0),
(2, 11, 0),
(2, 12, 100),
(2, 13, 750),
(3, 1, 0),
(3, 2, 0),
(3, 3, 0),
(3',4, 0),
(3,5, 700),
(3,6, 240),
(3, 7, 100),
(3, 8, 0),
(3, 9, 0),
(3, 10, 0),
(3, 11, 0),
(3, 12, 500),
(3, 13, 760);

 ID | Month | Incomes
  1 |    1   | 5000
  1 |    2   |    0
  1 |    3   |    0
  1 |    4   |    0
  1 |    5   |    0
  1 |    6   |    0
  1 |    7   |  400
  1 |    8   |  300
  1 |    9   |    0
  1 |   10   |    0
  1 |   11   |    0
  1 |   12   |    0
  1 |   13   |  400
  2 |    1   |    0
  2 |    2   |  100
  2 |    3   |    0
  2 |    4   |    0
  2 |    5   |    0
  2 |    6   |    0
  2 |    7   |    0
  2 |    8   | 1500
  2 |    9   |    0
  2 |   10   |    0
  2 |   11   |    0
  2 |   12   |  100
  2 |   13   |  750
  3 |    1   |    0
  3 |    2   |    0
  3 |    3   |    0
  3 |    4   |    0
  3 |    5   |  700
  3 |    6   |  240
  3 |    7   |  100
  3 |    8   |    0
  3 |    9   |    0
  3 |   10   |    0
  3 |   11   |    0
  3 |   12   |  500
  3 |   13   |  760

Я должен был сделать это с R и здесь они могли бы помочь мне, но теперь я должен сделать это с терадатой sql помощник.

Это то, что я хочу:

 ID | Month | Incomes | Quarterly
  1 |    1   | 5000     |    0
  1 |    2   |    0     |    0
  1 |    3   |    0     |    0
  1 |    4   |    0     |    1
  1 |    5   |    0     |    1
  1 |    6   |    0     |    1
  1 |    7   |  400     |    1
  1 |    8   |  300     |    0
  1 |    9   |    0     |    0
  1 |   10   |    0     |    0
  1 |   11   |    0     |   NA
  1 |   12   |    0     |   NA
  1 |   13   |  400     |   NA
  2 |    1   |    0     |    1
  2 |    2   |  100     |    0
  2 |    3   |    0     |    0
  2 |    4   |    0     |    0
  2 |    5   |    0     |    1
  2 |    6   |    0     |    1
  2 |    7   |    0     |    1
  2 |    8   | 1500     |    0
  2 |    9   |    0     |    1
  2 |   10   |    0     |    1
  2 |   11   |    0     |   NA
  2 |   12   |  100     |   NA
  2 |   13   |  750     |   NA
  3 |    1   |    0     |    0
  3 |    2   |    0     |    1
  3 |    3   |    0     |    1
  3 |    4   |    0     |    1
  3 |    5   |  700     |    1
  3 |    6   |  240     |    1
  3 |    7   |  100     |    0
  3 |    8   |    0     |    0
  3 |    9   |    0     |    1
  3 |   10   |    0     |    1
  3 |   11   |    0     |   NA
  3 |   12   |  500     |   NA
  3 |   13   |  760     |   NA

Это была моя попытка, но, очевидно, это не удалось, и я не получил то, что ожидал.

select Id,Month,Incomes, SUM(Incomes) OVER (PARTITION BY Id ORDER BY Month ROWS 3 PRECEDING) AS Quarterly from rentability  order by Id, Month

* Рентабельность - это созданная таблица.

Кто-нибудь может пометить 1 или максимум этого периода? Спасибо!

1 Ответ

1 голос
/ 04 марта 2020

Рассмотрим:

select 
    t.*,
    case when sum(income) over(
        partition by id 
        order by month 
        range between 1 following and 3 following
    ) > 0 
        then 1 
        else 0
    end quaterly
from StackTest t 

Это работает, выполняя сумму окна за 3 следующих месяца (мы используем определение диапазона вместо определения строки, поэтому это должно работать, даже если у вас отсутствуют записи).

...