Proc sql:基于回顾期的新客户和继续客户

2024-03-11

我有以下数据:

wei 01feb2018    car
wei 02feb2018    car
wei 02mar2019    bike
carlin 01feb2018 car
carlin 05feb2018 bike
carlin 07mar2018 bike
carlin 01mar2019 car

我想识别新客户和持续客户,如果客户在过去 12 个月内没有购买过商品,那么它将成为新客户。所需的输出就像

wei 01feb2018    car     new
wei 02feb2018    car     cont.
wei 02mar2019    bike    new
carlin 01feb2018 car     new
carlin 05feb2018 bike    cont.
carlin 07mar2018 bike    cont.
carlin 01mar2019 car     new

现在,如果客户在同一个月内为前客户购买了任何商品,即 1 月 1 日购买的汽车和 1 月 15 日购买的自行车,那么我希望在一份报告中将客户 a 分类为 1 月的新客户,在另一份报告中,我希望客户 a 都为新客户并继续。

我正在尝试但不明白逻辑 -

proc sql;
select a.*,(select count(name) from t where intnx("month",-12,a.date) >= 356) 
as tot
from t a;
Quit;

您似乎需要两个不同的“状态”变量,一个用于连续性over前一年和连续性的一年within month.

在 SQL 中,存在自反相关子查询结果可以是满足以下条件的行的案例测试over and within标准。日期算术用于计算相隔天数和INTCK用于计算间隔月份:

data have; input
customer $ date& date9. item& $; format date date9.; datalines;
wei     01feb2018  car
wei     02feb2018  car
wei     02mar2019  bike
carlin  01feb2018  car
carlin  05feb2018  bike
carlin  07mar2018  bike
carlin  01mar2019  car
run;

proc sql;
  create table want as
  select *,
    case
      when exists 
      (
        select * from have as inner 
        where inner.customer=outer.customer
          and (outer.date - inner.date) between 1 and 365
      ) 
      then 'cont.'
      else 'new'
    end as status_year,
    case
      when exists 
      (
        select * from have as inner 
        where inner.customer=outer.customer
          and outer.date > inner.date
          and intck ('month', outer.date, inner.date) = 0
      ) 
      then 'cont.'
      else 'new'
    end as status_month
  from have as outer
  ;
quit;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Proc sql:基于回顾期的新客户和继续客户 的相关文章

  • sas 为数据步骤中的每个实例执行宏

    我有一个宏 可以在一组给定的时间范围内将数据插入表中 它循环遍历一系列 从 到 日期 存储在数据集中 并使用 proc sql insert 语句运行宏 在所有这些结束时检查数据时 我注意到新数据集中只有最后一个 从 到 期间的数据 这是我
  • 在 SAS 中,捕获语法错误的好技术/选项是什么?

    在增强的编辑器中 颜色可能会给您提示 然而 在大型机上 我不相信编辑器中有任何东西可以帮助您 I use OPTIONS OBS 0 noreplace obs 0 选项指定从输入中读入 0 个观测值 dataset 和 NOREPLACE
  • 北欧航空公司。变量是否在数据步骤的每次迭代中都设置为缺失?

    我一直认为数据步骤的每次迭代都将变量设置为缺失 然而 在下面的代码中 变量看起来像是保留了最开始获取的值 我不明白为什么会发生这种情况 data one input x y datalines a 10 a 13 a 14 b 9 run
  • 使用 Teradata ODBC 与 Teradata 数据库的 SAS 连接

    我正在尝试连接到 SAS 中的 Teradata 我在机器上设置了 Teradata ODBC 目前我的假设是使用 ODBC 是我访问数据库的唯一方法 这是我的连接命令的语法 库名称 Teradata ODBC dsn dsnname ui
  • 将 CSV 中的所有列导入为字符?

    简单的问题 PROC IMPORT OUT braw address DATAFILE path address data csv DBMS csv REPLACE GETNAMES YES RUN 该语句将创建数据集列作为字符or数字取决
  • 导出文件期间检测到打开代码语句递归

    我尝试在 SAS 中导出文件 但收到 检测到打开代码语句递归 错误 由于我根据根据提示日期定义为宏变量的日期导出多个文件 因此我想用此变量命名要导出的文件 但它不起作用 如果有人帮助我 我将非常感激 rep date 30APR2015 0
  • 导出 SAS 数据集中的变量类型

    有没有简单的方法来捕获和导出 SAS 数据集中每个变量的类型 我正在将数据集导出为 CSV 格式以读入 R 并且read table如果后者还知道每个变量的数据类型 则后者的过程可以更有效地工作 PROC CONTENTS 有一个 OUT
  • 在SAS中使用循环重命名索引列?

    我有一个数据集 其中变量为 col1 col2 col3 col15 我想将它们重命名为new1 new2 new3 new 15 我可以写15次类似的rename col1 new1 在 SAS 中 但如何使用循环实现此目的 谢谢 首先
  • 解析宏变量名称中包含 %eval 的宏,SAS

    这是一个玩具示例 旨在帮助解决我遇到的更大问题 它本质上涉及在引用更大的宏变量名称时使用 eval 宏 我创建了一个宏变量 x 2 它使用循环 it 的值 从最终输出可以看出该变量已成功创建 但是我只能将其放入日志而不评估 it 1 这当使
  • SAS 数据合并以求存在

    我是 sas 新手 我有两个数据集如下 data datasetA input a 1 datalines 1 2 3 4 5 6 7 run data datasetB input a 1 datalines 1 3 5 7 run 如果
  • 当我将 SAS 数据集导出到 csv 时;它正在修剪字符中的所有前导空格

    当我将 SAS 数据集导出到 csv 时 它正在修剪字符中的所有前导空格 请帮助我保留 csv 输出中的所有前导空格 使用的语句是 Proc Export Data Globl Mth Sumry OutFile GMUPath 20 Rp
  • SAS列出并存储指定库下的所有表名到表中

    在库 测试 下 我有 5 个数据集 如何列出所有表名称 proc datasets lib work quit run 虽然我想进一步利用这些信息 就像表名一样 Thanks 使用 SQLdictionary tables view pro
  • SAS 和 Excel 中百分位数的不同结果

    我正在尝试获取 SAS 中的百分位数 我在 Excel 中得到了百分位数 我期望在 SAS 中也得到相同的结果 但是当我在 SAS 中得到百分位数时 它与 excel 中的不同 我正在使用下面的示例数据 1 2 3 4 5 6 7 8 9
  • 转置逗号分隔字段

    我有一个如下所示的数据集 并且正在使用 SAS Enterprise Guide 6 3 data have input id state cards 134 NC NY SC 145 AL NC NY SC run 我有另一个数据集 其中
  • SAS 全球日期比较

    我正在尝试进行日期比较 但没有得到正确的结果 有谁知道发生了什么事吗 macro ttt let check start 28APR2014 if check start d lt 25may2014 d then let true 1 e
  • SAS,按组求和

    我想通过var1计算总和 你能用两种方法来计算吗 SQL 和数据步骤使用 if first var1 data have input var1 var2 var3 datalines 1 a 3 1 a 4 1 a 3 2 b 5 2 b
  • 使用 Proc sql 和 Teradata 在 SAS 中编写高效查询

    编辑 这是一组更完整的代码 它准确地显示了下面的答案所发生的情况 libname output data files jeff let DateStart 01Jan2013 d let DateEnd 01Jun2013 d proc s
  • Office 2010 中的 SAS DDE 问题

    当我运行 Office 2007 时 我的 SAS DDE 脚本可以很好地填充 保存并关闭 Excel 文件 我最近更新到 Office 2010 总体工作正常 但 Excel 在保存对话框中停止 我必须手动单击 保存 而以前我不需要这样做
  • 将 SAS 中的三次样条有效地拟合到特定的对象网格

    我有一个数据集mydat具有以下变量 MNES IV 0 84 0 40 0 89 0 34 0 91 0 31 0 93 0 29 0 95 0 26 0 98 0 23 0 99 0 22 1 00 0 22 1 02 0 20 1 0
  • 重新排列 sas 数据集中的变量 - 按字母顺序排列

    我有大约 500 列的数据集 我想按字母顺序重新排列所有变量 除了在 set 语句之前使用保留语句之外 我还能以其他方式做到这一点吗 您可以动态生成变量名称列表 并使用以下命令创建新数据集PROC SQL proc sql select n

随机推荐