首页 > 解决方案 > 我如何从最小和最大组中获取日期?

问题描述

我是一名 SAS 开发人员。我有一个 sql 用于从名为“CalculatedPower”的列中获取最小值和最大值。下面是我从 group by 语句中得到的结构(lt_dt 和 lp_dt 是我想要的。我把它放在这里,但它不在我的实际表中,因为我不知道如何实现这一点):

station datetime        calculatedpower min_power   max_power   lt_dt               lp_dt
ABBA    28AUG2018:0:0:0     100         1            100        01SEP2018:1:0:0     28AUG2018:0:0:0
ABBA    31AUG2018:12:0:0    88          1            100        01SEP2018:1:0:0     28AUG2018:0:0:0
ABBA    01SEP2018:1:0:0     1           1            100        01SEP2018:1:0:0     28AUG2018:0:0:0
ZZZZ    07SEP2018:0:0:0     900         900          3000       07SEP2018:0:0:0     21SEP2018:0:0:0
ZZZZ    09SEP2018:0:0:0     1000        900          3000       07SEP2018:0:0:0     21SEP2018:0:0:0
ZZZZ    21SEP2018:0:0:0     3000        900          3000       07SEP2018:0:0:0     21SEP2018:0:0:0

如您所见,我将它们按 Station 聚合并使用 Min 和 Max 函数来获取 min_power 和 max_power。现在,我还需要获取最小日期时间(进入 lt_dt)和最大日期时间(进入 lp_dt)。我会期待如下: ABBA lt_dt 是 01SEP2018:1:0:0 而 lp_dt 是 28AUG2018:0:0:0

意思是说,lp_dt(datetime based on max_power) 而 lt_dt(datetime based on min power)

我的分组声明如下:

proc sql;
select 
station
,datetime
,calculatedpower
,min(calculatedpower) as lt_calculatedpower
,max(calculatedpower) as lp_calculatedpower
from sumall
group by 
station
;
quit;

有没有办法调整我现有的 SQL 语句以实现我想要的日期时间?我尝试了如下所示的附加 SQL 语句(但处理 600k 数据需要很长时间,不确定它是否有效,因为它仍在运行)

proc sql;
select *,
case when calculatedpower=lt_calculatedpower then datetime end as lt_datetime
from minmax;
quit;

使用此代码,我预计如果有几行具有相同的计算功率但与 1 个站点相关的日期时间不同,则会出现问题。

标签: sqlsas

解决方案


这是 SAS PROC Summary 和 DATA STEP 合并以获得最终所需的输出。

使用 OUTPUT 语句中的 MAXID、MINID 选项来获取最大值的 ID 和最小值的 ID。

解决方案的第一部分会生成您的虚假数据 - 请在将来提供该格式的数据。然后 PROC Summary 计算统计数据,您可以将其合并。这应该在您的系统上非常快地完成,不到一分钟。

data have;
input station $ datetime  anydtdtm.      calculatedpower ;
format datetime datetime.;
cards;
ABBA    28AUG2018:0:0:0     100         
ABBA    31AUG2018:12:0:0    88          
ABBA    01SEP2018:1:0:0     1           
ZZZZ    07SEP2018:0:0:0     900         
ZZZZ    09SEP2018:0:0:0     1000        
ZZZZ    21SEP2018:0:0:0     3000        
;;;;
run;

proc summary data=have nway;
class station;
id datetime;
var calculatedPower;
output out=summary min=Min_power max=max_power minid=min_date  maxid=max_Date;
run;

data final;
merge have summary;
by station;
run;

编辑:删除了 autoname 选项,因为我明确命名了输出变量。

EDIT2:当多个观测值在所有 MIN 或 MAX 变量中包含相同的极值时,PROC MEANS 使用观测值来确定将哪个观测值写入输出。默认情况下,PROC MEANS 使用第一个观察来解决任何关系。但是,如果您指定 LAST 选项,则 PROC MEANS 将使用最后的观察结果来解决任何关系。

https://documentation.sas.com/?docsetId=proc&docsetTarget=p04vbvpcjg2vrjn1v8wyf0daypfi.htm&docsetVersion=9.4&locale=en#p1p58yhxlrc0can1scam7bco7y96


推荐阅读