如果客户在接下来的3个月内购买了sql assistant,则输入1

如果客户在接下来的3个月内购买了sql assistant,则输入1,sql,teradata,window-functions,Sql,Teradata,Window Functions,我是teradata SQL assistant的初学者,不知道它是否能满足我的需要 我有一个变量ID、月份(或期间)和当月收入的基数。我需要的是,如果客户在未来3个月内购买,则输入1;如果客户在未来3个月内购买,则输入0,并对所有ID执行此操作。例如,如果我在第1个月,并且在未来3个月内购买,则在该行中为该客户输入1。在最后一个期间,由于不会有3个月,NA出现 下面是示例数据的代码: IF OBJECT_ID('tempdb..#StackTest') IS NOT NULL DROP

我是teradata SQL assistant的初学者,不知道它是否能满足我的需要

我有一个变量ID、月份(或期间)和当月收入的基数。我需要的是,如果客户在未来3个月内购买,则输入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来做,他们可以帮助我,但现在我必须用teradata sql assistant来做

这就是我想要的:

 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
*rentability是一个创建的表

有人知道如何用1或该周期的最大值标记吗?谢谢

考虑:

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个月内执行窗口求和来实现的(我们使用范围定义而不是行定义,因此即使您缺少记录,这也会起作用)。

回答不错——在窗口功能中使用的范围非常罕见。数据当前不支持介于之间的范围,因此如果标记正确,这将不起作用。虽然如果数据没有丢失的月份(如示例中所示,始终有一行为零),那么两行之间的行应该可以工作。您的示例代码是针对SQL Server的,您真的在访问Teradata系统吗?