查找 minimum/oldest 两种不同格式的每个订户的创建日期 SAS
Finding minimum/oldest create date for each subscriber in two different formats SAS
我有一个呼叫记录数据集,该数据集是针对一组多次呼叫的订户进行的,每次呼叫尝试都在一个新行上进行。我需要根据第一次与订户联系的时间来分析一些数据,但我无法提取最短联系日期。我已经尝试了一些东西,但我创建的唯一成功的输出只是输出已经链接到线路的创建日期(这是我需要为每个订户的一组呼叫获取最小值的变量),而不是最小的在数据集中为该订阅者创建日期。
我理想的结果是这样的(其中 min_date/min_month 是我要创建的变量):
订阅者 ID |创建日期 | Min_date | Min_month
123456 | 2020 年 1 月 1 日 | 2020 年 1 月 1 日 | 2020 年 1 月
123456 | 2020 年 3 月 5 日 | 2020 年 1 月 1 日 | 2020 年 1 月
我在输出格式方面也遇到了一些问题。当我确实得到输出时,我得到的日期格式是某种顺序数字代码?例如,我会得到类似“22095”的信息,而不是任何类型的实际日期。
我用来提取最短日期的代码:
create table min_dates as
select
sub_id,
min2.min_date2
from (select 'Subscriber ID'n as sub_id, min('Create Date'n) as min_date2 from work.min) as min2
inner join work.min as min1 on min1.'Subscriber ID'n = min2.sub_id;
quit;
我认为这可能有效,但由于格式问题我无法确定。当我在代码末尾将此子表重新加入主数据拉取时,所有值也都丢失了。如果代码正确,我还需要两件事:
- 相同的最小日期被分解为一个新的列,只有月份和年份
- min_date 已正确格式化为可读日期(我不需要任何特定的日期格式,只要它确实是一个日期即可)
但如果它是错误的并且只是在同一行给我日期,我也需要修正它。
感谢任何帮助。
SAS 日期值只是具有特殊含义的数字(自 01jan1960
以来的天数)。
将格式应用于所选变量,它将显示为人类可读的日期。
select
sub_id,
min2.min_date2 format=DATE9.
from
...
变量最初是计算出来的,没有应用格式。这就是为什么您的原始代码将日期值显示为数字的原因。
如果您想使用 SQL,您必须告诉 SAS 使用什么格式来显示您的计算变量。要按组聚合,请使用 GROUP BY 子句。
select Subscriber_Id, min(Create_Date) as min_date2 format=date9.
from have
group by Subscriber_Id
;
如果您改用 PROC SUMMARY,则计算出的变量将具有与源变量相同的附加格式。您可以使用 CLASS 语句进行分组,或者如果数据使用 BY 语句排序。
proc summary nway data=have ;
class Subscriber_Id;
var Create_Date ;
output out=want min=min_date2 ;
run;
要获得精确的 table 每组多个观察结果,您可以使用 PROC SQL 的功能自动将汇总统计数据与详细观察结果重新合并。
select Subscriber_Id
, Create_Date
, min(Create_Date) as min_date format=date9.
, min(Create_Date) as min_month format=monyy7.
from have
group by Subscriber_Id
;
我有一个呼叫记录数据集,该数据集是针对一组多次呼叫的订户进行的,每次呼叫尝试都在一个新行上进行。我需要根据第一次与订户联系的时间来分析一些数据,但我无法提取最短联系日期。我已经尝试了一些东西,但我创建的唯一成功的输出只是输出已经链接到线路的创建日期(这是我需要为每个订户的一组呼叫获取最小值的变量),而不是最小的在数据集中为该订阅者创建日期。
我理想的结果是这样的(其中 min_date/min_month 是我要创建的变量):
订阅者 ID |创建日期 | Min_date | Min_month
123456 | 2020 年 1 月 1 日 | 2020 年 1 月 1 日 | 2020 年 1 月
123456 | 2020 年 3 月 5 日 | 2020 年 1 月 1 日 | 2020 年 1 月
我在输出格式方面也遇到了一些问题。当我确实得到输出时,我得到的日期格式是某种顺序数字代码?例如,我会得到类似“22095”的信息,而不是任何类型的实际日期。
我用来提取最短日期的代码:
create table min_dates as
select
sub_id,
min2.min_date2
from (select 'Subscriber ID'n as sub_id, min('Create Date'n) as min_date2 from work.min) as min2
inner join work.min as min1 on min1.'Subscriber ID'n = min2.sub_id;
quit;
我认为这可能有效,但由于格式问题我无法确定。当我在代码末尾将此子表重新加入主数据拉取时,所有值也都丢失了。如果代码正确,我还需要两件事:
- 相同的最小日期被分解为一个新的列,只有月份和年份
- min_date 已正确格式化为可读日期(我不需要任何特定的日期格式,只要它确实是一个日期即可)
但如果它是错误的并且只是在同一行给我日期,我也需要修正它。
感谢任何帮助。
SAS 日期值只是具有特殊含义的数字(自 01jan1960
以来的天数)。
将格式应用于所选变量,它将显示为人类可读的日期。
select
sub_id,
min2.min_date2 format=DATE9.
from
...
变量最初是计算出来的,没有应用格式。这就是为什么您的原始代码将日期值显示为数字的原因。
如果您想使用 SQL,您必须告诉 SAS 使用什么格式来显示您的计算变量。要按组聚合,请使用 GROUP BY 子句。
select Subscriber_Id, min(Create_Date) as min_date2 format=date9.
from have
group by Subscriber_Id
;
如果您改用 PROC SUMMARY,则计算出的变量将具有与源变量相同的附加格式。您可以使用 CLASS 语句进行分组,或者如果数据使用 BY 语句排序。
proc summary nway data=have ;
class Subscriber_Id;
var Create_Date ;
output out=want min=min_date2 ;
run;
要获得精确的 table 每组多个观察结果,您可以使用 PROC SQL 的功能自动将汇总统计数据与详细观察结果重新合并。
select Subscriber_Id
, Create_Date
, min(Create_Date) as min_date format=date9.
, min(Create_Date) as min_month format=monyy7.
from have
group by Subscriber_Id
;