首页 > 解决方案 > 如果客户在接下来的 3 个月内购买了 sql 助手,则输入 1

问题描述

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

我有一个包含变量 ID、月份(或期间)和该月收入的基础。我需要的是,如果客户在接下来的 3 个月内购买,则输入 1,否则输入 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 助手来做。

这就是我要的:

 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 或那个时期的最大值来标记?谢谢!

标签: sqlteradatawindow-functions

解决方案


考虑:

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 个月内执行窗口总和来工作(我们使用范围定义而不是行定义,因此即使您丢失了记录也应该可以工作)。


推荐阅读