sql - 如果客户在接下来的 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 或那个时期的最大值来标记?谢谢!
解决方案
考虑:
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 个月内执行窗口总和来工作(我们使用范围定义而不是行定义,因此即使您丢失了记录也应该可以工作)。
推荐阅读
- php - Setting Paypal Checkout Price
- c# - 如何对 JsonProperty 名称进行单元测试
- vega-lite - Vega lite 计算问题
- python - 获取:UnicodeEncodeError:“charmap”编解码器无法对位置 0-1 中的字符进行编码:字符映射到
- javascript - 将 Javascript 对象解析为类似 JSON 的字符串,但使用单引号
- git - Gitlab CI:在同一作业中上传工件后如何运行 curl 脚本?
- python - 重新索引数据帧反向多索引级别
- javascript - 试图在我的数据库中以嵌入的形式列出电影
- javascript - 将连接到现有 websocket 的 js 代码转换为 react js 应用程序
- signal-processing - 一转需要多少数据点?