【发布时间】:2018-10-11 09:29:55
【问题描述】:
我是一名 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 个站点相关的日期时间不同,则会出现问题。
【问题讨论】:
-
为什么不简单地将 max(datetime) 作为 lt_dt 并与 min 相同?我错过了什么?
-
lp_dt 是基于 max_power 的日期时间,而不是最大日期时间。如果 max_power 在第 2 行,lp_dt 应该是第 2 行的 1。因此, max(datetime) 不会得到我想要的结果。
-
一定要用SQL吗?带有 ID 的 PROC Summary 是一个不错的选择或数据步骤。
-
@Reeza 你能提供一些样本吗?我以前从未使用过 PROC Summary。
-
如果有多个不同的日期,
calculatedpower = maxpower对应同一个station,你想选择哪个日期?